おいも貴婦人ブログ

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

プログラミング

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

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

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

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

2次元イジングモデル

ホップフィールドネットワークのプログラムを書いたので、2次元イジングモデルのプログラムも書いてみました。イジングモデルは磁性体を表したモデルです。磁性体は磁石だと考えてもらって結構だと思います。磁石は、熱を与えるとその磁性を失います(つまり…

続:ホップフィールド(Hopfield Network)

大昔にHopfield Networks(HN:この略し方に一般性はありません。)についてのPythonプログラムを書いたが、あまりにも酷かったので書きなおしてみました。HNは連想記憶モデル、言い換えると、教師あり型のパターン認識方法の一種だと考えられます。教師あり型…

ドメイン名から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…

Streaming SIMD Extensions(SSE)[Wiki]

ストリーミングSIMD拡張命令 (Streaming SIMD Extensions, SSE) は、インテルが開発したCPUのSIMD拡張命令セット、およびその拡張版の総称である。 SSEは、x86アーキテクチャに8本の128ビットレジスタを新設し、浮動小数点演算のSIMD処理を実現したものであ…

フリンの分類[Wiki]

コンピュータアーキテクチャの分類法である。 Single Instruction, Single Data stream (SISD) 命令にもデータにも並列性のない逐次的なコンピュータ。SISDアーキテクチャの例としては、いわゆるシングルプロセッサのマシンが挙げられ、旧式のパーソナルコン…

大沢統計第1章(2)

前回に続いて大沢統計をプログラミングしてみました。 内容は前回の記事とほぼ一緒です。最初にnum_person人にmoney=30をランダムで配ります。その後にランダムで選ばれた人が、ランダムに選ばれた人にmoney=1を渡すという過程を10000回繰り返します。結果と…

大沢統計第1章(1)

生物物理学分野の大御所、大沢文夫先生が執筆された『大沢流手づくり統計力学』の第1章の内容をプログラミングしてみました。大沢流 手づくり統計力学作者: 大沢文夫出版社/メーカー: 名古屋大学出版会発売日: 2011/08/10メディア: 単行本購入: 1人 クリック…

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:…

Pythonのmatplotlibを使ってアニメーションを作る。

matplotlibを使って、y=xの直線を引くアニメーションを作成しました。初めて使う機能はシンプルであればシンプルである程いいと思うので、ソースも出来るだけシンプルに書きました。 #! /usr/bin/env python from matplotlib import animation as anim impor…

Fortranにおけるコマンドライン引数

iargc()で引数の数を数え、getargに空の文字列と引数の番号を与えると、与えた文字列に対応するコマンドライン引数を代入してくれる。不思議なのは、引数番号0にはプログラム名が入っているところで、fortranのループが1から回ることを考えれば、引数番号1に…

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

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

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

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

1次元のランダムウォーク(今更!!)

このプログラムでは、正規分布に従い乱数を発生させ、その値が負であるならば-1で正であるならば+1させます。これを時間発展させればランダムウォークの出来上がりです。 #! /Usr/bin/env python import numpy as np import matplotlib.pyplot as plt fig=pl…

ホップフィールド(Hopfield)

Hopfieldはアメリカの物理学者J.J. Hopfieldによって提唱された。一種の連想記憶モデルであり、パターンを学習させると、そのパターンを再起するというものである。Hopfieldネットワークは相互結合型のネットワークで、1つのノードは他のすべてのノードとつ…

サモンのマップ化(Sammon mapping)

サモンのマップ化とは、高次元特徴ベクトルを持つデータを2次元にマッピングして、クラスタリングする方法です。誤差関数を以下のように定義する。 \(E=\frac{1}{\sum_i \sum_{j>i}d_{ij}} \sum_i \sum_{j>i}d_{ij} \frac{(d_{ij}-||{\bf r}_i -{\bf r}_j||…

Python:分子動力学を理解するために(1)

分子動力学を理解するために、pythonでLJポテンシャルを持つ粒子のコードを書いてみました。pythonで書いた理由は、楽だからです。設計も何も考えずに書くには、スクリプト言語が最適ですね。以下のコードは、周期境界条件やその他諸々の効果が抜けておりお…

CUDA:インストール

まず、最初のインストールする上ですごく参考になったサイト http://d.hatena.ne.jp/iRiE/20120309/1331303439詳しくは上記のサイトを参考にして欲しいのですがubuntu12.04でのインストールをまとめると display driver sudo apt-get install nvidia-current…

C言語:クラスター分析(株価を解析)

前に上げたCのコードを使って株価をクラスター分析してみました。東証一部の2012の日足の終値データを元にしています。株価のデータは正規化されています。そして、前のクラスター分析のコードは距離の定義はユークリッド距離のみでしたが、今回は1から…

C,Fortran,C++,java,numpy速度比較:1000次正方行列の積

環境:Core 2 Duo C++,Cとfortranは配列の動的確保版がります。CとC++ではスタックサイズが1Mbらしいので、それを解除してやります。(intel コンパイラでの実行環境はi7 860) ulimit -s unlimited結果としては 1.c 11.38s 動的:18.36s >>gcc -O3 -msse4.1…

C言語:階層的クラスタリング、階層的クラスター分析(完)

とりあえず完成しましたが読むに値しないコードです。やっぱりコードを描く上で難しいのが変数の名前と注釈だと思います。とりあえず、仕様は前の記事の通りになりました。これから、たくさんのコードを描いていきたいと思います。 以下コードです。 #includ…

C言語:階層的クラスタリング、階層的クラスター分析(未完)

C言語で階層的クラスタリングを書いてます。そもそも「Rを使え」って話なんでしょうけど、使ったことないからわからないんですがベクトルの要素が10000くらいで500個くらいのデータをクラスター分析しようと思ったらとてつもなく時間がかかってしまうような…

Python:集合知プログラミング(インスタンス変数について)

これはオライリーの集合知プログラミングで出てくるサンプルプログラムを少々変えたものです。 内容はクラスがbicluster,関数がEuclidean,hcluster2つが宣言されているだけです。で最後に biclusterのオブジェクトを作成して内容を確認するだけです。だから…

Python のモジュールをCで描く。内積

すべてを理解しているわけではないので、とりあえずコードを載せときます。「納得!!」と思ったらまとめる予定。 cal_dot.c #include <Python.h> static PyObject* dot(PyObject* list1,PyObject* list2) { long size1=PyList_Size(list1); long size2=PyList_Size(list</python.h>…