おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

C言語

続*5:2次元イジングモデル

前回、紹介しましたCheckerboard decompositionをC言語で実装しました。マジックナンバーがふんだんに盛り込まれています。(8,3)でCheckerboard decompositionしたのは、(0,1),(0,2),(0,3),(1,0),...,のように行列の要素を並べた時に、奇数番目と偶数番目に…

続々:2次元イジングモデル

CUDAで下手くそなプログラミングを書いてみました。対象は前回から引き続き2次元イジングモデルです。2次元の行列サイズは1024x1024と2048x2048、ループ回数は1000です。コード中のMT.hは乱数を生成するためにメルセンヌツイスターを使用しているからです。…

続:2次元イジングモデル

前回の2次元イジングモデルのコードをCで書きなおしてみました。unixの標準コマンドtimeを使って、openmpありとなしの実行時間を計算してみます。2次元の行列サイズは1024x1024、ループ回数は1000です。コード中のMT.hは乱数を生成するためにメルセンヌツイ…

ドメイン名からIPアドレスをゲットする。

Networkプログラミングの初歩の初歩。 とりあえずドメイン名から、IPを取得しましょう。 #include <stdio.h> #include <stdlib.h> #include <netdb.h> int main(void){ struct hostent *he; if((he=gethostbyname("www.google.com"))==NULL) exit(1); printf("---\n"); printf("%d.%d.%d.</netdb.h></stdlib.h></stdio.h>…

はじめてのOpenMP(4)

OpenMPの構文は以下のようになります。 #pragma omp 指示文名 [指示句[]...] 指示文 parallel 構文 並列実行の開始を指示し、複数のスレッドを生成する。 for 構文 forループの繰り返しがスレッドに並列処理されることを指定する。 #pragma omp for [指示句[…

はじめてのOpenMP(3)

private指示文 ソースと実行結果を見れば、private指示文の挙動がわかると思います。OpenMPでfor文を並列化するとき、for文で使用されるインデックスは自動的にprivate変数になっています。 #include <omp.h> #include <stdio.h> int main(void){ int i=0,j=10,k=20; #pragma</stdio.h></omp.h>…

はじめてのpthread(1)

pthreadを使って、並列処理を体感してみました。しかし、その実態は難解、OpenMPと比べて難しすぎる。そのせいか、参考となるドキュメントも少ない。pthreadとOpenMPの違いは難易度以外に、並列計算を実行するときの変数の扱いにあります、OpenMPはスレッド…

はじめてのOpenMP(2)

sectionに分けて並列化をする。 #include <omp.h> #include <stdio.h> int main(void){ int i; int th_num[3]; #pragma omp parallel { #pragma omp sections { #pragma omp section { th_num[0]=omp_get_thread_num(); } #pragma omp section { th_num[1]=omp_get_thread_nu</stdio.h></omp.h>…

はじめてのOpenMP(1)

OpenMPを使って簡単なプログラムを書いてみました。 #pragma omp parallel num_threads(4):OpenMPの始まりとスレッド数の指定する。 #pragma omp for:OpenMPを使って、forを各スレッドに分割する。 omp_get_thread_num():スレッドの番号を取得する。 omp_get…

構造体内で定義されているファイルポインタ。

ヘッダファイルに構造体を宣言し定義し、以下のソースのように、tmp1.cで読み込んだファイルポインタがtmp2.cでは消えている…。 tmp1.c #include <stdio.h> #include <stdlib.h> #include "t_struct.h" void tmp2(void); int main(void){ if((t_s.infile=fopen("tmp1.c","r"))==</stdlib.h></stdio.h>…

fortran90(f90)のコードをCに書き換える..............。(f90toC)

http://www.ncsa.illinois.edu/People/mdewing/f90toC/から、f90toC.tar.gzをダウンロードする。 $tar xvfz f90toC.tar.gz $cd f90toC $make すると、以下のようなエラーが出る。 cc -ggdb -c f90main.c f90main.c: In function ‘genmain’: f90main.c:22:17:…

char *strとchar str[]で定義したときの挙動の違い。

上記の定義は一見違うように見えるが、ある文字列"___str"(アンダーバーはスペース)があり、このスペースを除く関数では挙動が違う。どうして違うのかは目下調査中、以下に正常に動作するコードとしないコードを載せる。下記の本に書いてありそう。C言語ポイ…

string.hの関数一覧(定義のみ)

string.hで定義している関数の一覧を示します。使うときなどに参考にする予定。 以下の内容は man stringで確認することができるので、一度確認してください。memcpy,memmove,memcmp,memchar,memsetなどのmem系?が定義されていません…。どうしてでしょう。 …

mallocとcallocの違い。

言わずと知れたメモリ確保のためのmallocとcalloc関数。これらの違いをcallocは、0で初期化し、mallocはしないと考えてました。 しかし、callocは’\0’ヌル文字で初期化するのであって、0で初期化するのではありません。ここら辺が、分かっていないとバグの温…