余白の書きなぐり

aueweのブログ

C

Makefile文法ミニマム

自分用のメモとして、Makefileの文法で忘れがちな部分をまとめておく。 想定してるのは GNU make 4.2.1 で、Linux や Mac OS X で普通に make コマンドを叩いたときに走るやつだ。 FreeBSD や Solaris では gmake コマンドらしい。 Windowsでは http://gnuwi…

Makefileでソース、ヘッダファイルの依存関係を処理

大規模なC言語プログラムでは、ソースやヘッダファイルが複雑な依存関係を持つため、それらを自動解決してくれるMakefileが欲しくなる。 欲望を具体化すると ソース、ヘッダ、オブジェクトファイルは異なるディレクトリに入れたい 依存関係を認識し、更新す…

C言語からLAPACKのzheevを呼んでエルミート行列を対角化

昔書いた記事のコメントでzheevの使い方を書けと言われた。 なので書いた。僕は優しいなあ。 こういうのは他人が書いた記事を鵜呑みにするより、zheev.fでググってヒットする一次情報を見るほうがいいと思うよ。 Fortranが分からなくても普通に読めると思う…

C言語からLAPACKを呼んで逆行列を求める(LU分解する)

数値解析の授業で逆行列は求めちゃダメって言われたけど、気にしない気にしない。 実行列の逆行列を求める Fortranの DGETRF でLU分解した後、 DGETRI で逆行列を求める。 /* * hoge.c * SIZE*SIZE型の実行列の逆行列を計算 * 元の行列は * (2 3 ) * (1 0.5)…

OpenMPで多重forループを並列化して配列に格納する方法

注意点 forループを並列化して配列に値を代入したい。 forループが一重の時は簡単だけど、 多重forループの場合には 内側から #pragma omp parralel forしないとバグる。 以下の正解とまちがいを見れば、よくわかる。 正解 // 内外共に #pragma omp する int…

LinuxMintにPyclewnを導入してgdbをVimで動かす

この記事はPyclewnのインストール記事です。 Windowsへのインストールは色々難しくて断念した。以前のバージョンは簡単にインストールできたみたいだけど、最近はうまくいかない。なのでLinuxMintに導入した。 VimShellでiexe gdbするのもいいけど、breakpoi…

OpenMPIで乱数を使う

普通の(並列計算でない)プログラムで乱数を使用する際に、 プログラムを実行するたびに異なる系列で擬似乱数を発生させるには seed に現在時刻を使用するのが一般的だ。 要するに srand((unsigned) time(NULL)); とすればよい。詳細は以下のページにまとまっ…

OpenMPI で配列をまとめる(2)

前回 とほとんど同じだけど、備忘録として。 やりたいこと プロセス数 allrank を 4 として、 各 myrank の配列 my_array[3] myrank == 0 ... my_array[3] = {0,4,8}; // 前回は{0,1,2}だった myrank == 1 ... my_array[3] = {1,5,9}; // 前回は{3,4,5}だっ…

OpenMPI で配列をまとめる

やりたいこと プロセス数 allrank を 4 として、 各 myrank の配列 my_array[3] myrank == 0 ... my_array[3] = {0,1,2}; myrank == 1 ... my_array[3] = {3,4,5}; myrank == 2 ... my_array[3] = {6,7,8}; myrank == 3 ... my_array[3] = {9,10,11}; をまと…

高速フーリエ変換ライブラリ fftw のインストールと使用法

インストール Linux(Ubuntu)への導入 インストール $ sudo apt-get install libfftw3-3 libfftw3-dev libfftw3-doc コンパイル方法 $ gcc hoge.c -lm -lfftw3 Windowsへの導入 fftwのwindows版インストーラのページから 32-bit version: fftw-3.3.3-dll32.zi…

C言語で並列処理(OpenMP)

Windows(minGW), Mac, Linux のgcc(version 4.2以降)で動作確認済。 新しいライブラリ等をインストールすることなく、デフォルトのままのgccでコンパイルが通った。 こんなに手軽に並列計算できるなんてすごい。 ソースコード // hoge.c // 並列処理のプログ…

C言語からLAPACKのzgeevを呼んで複素行列を対角化

/* * SIZE*SIZE型の複素行列の固有値と固有ベクトルを計算 * (1 2i) * (i 1+i) */ #define SIZE 2 // 2*2型の行列 #include <stdio.h> #include <complex.h> int main(void) { char jobvl = 'N' ;// 左固有ベクトルは計算しない char jobvr = 'V' ;// 右固有ベクトルは計算する i</complex.h></stdio.h>…

LAPACKを導入してC言語からコンパイル (Linux, Windows)

Fortran には LAPACK と呼ばれる密行列用の線形演算パッケージが存在する。 行列の固有値を求めたり連立方程式を解いたりしてくれる。便利。 疎行列にはARPACKを使ったほうがいいらしい。 今回は LAPACK を導入して C言語から呼び出す方法を書くよ。 Linux L…