/* * 超適当なSIMD講座 * * ページ作って更新しないってwww * とりあえず開発環境はgcc(cygwinもOK)のinline。 * とりあえずコピペで使えるレベルにしておく。 */ /* * 32bit OSで使えるレジスタはxmm0~7の8本。 * 64bit OSで使えるレジスタはxmm0~15の16本。 * * SSEで使える変数型は1レジスタあたり * short(2byte/16bit integer) * 8 * long (4byte/32bit integer) * 4 * float(4byte/32bit real) * 4 * double(8byte/64bit real) * 2 * * こんなもん。一番おいしいのはshortなんだが計算精度低すぎてワロタwww * お勧めはfloatかな? * * あと普通にFPU使っているときは計算精度80bitで処理する。 * SIMDの有無で計算結果違うから気をつけろ!! * */ float inData [4] __attribute__((aligned(16))); float inData2[4] __attribute__((aligned(16))); /* 上のは16byte alignedになるようによろしく、って意味。 * mallocもそうしたい?それ無理w * そんなときは多めに確保して、おいしいところだけ使う。 * data_=malloc(sizeof(int)*(1000+15)); * data = ((unsigned int)data + 15) % 16; * : * free(data_); */ float outData[4]; int main() { inData[0] = 10.0; inData[1] = 20.0; inData[2] = 30.0; inData[3] = 40.0; inData2[0] = 1.0; inData2[1] = 2.0; inData2[2] = 3.0; inData2[3] = 4.0; __asm__( "MOVDQA _inData, %xmm0 \n\t" /* Alignedされている領域からmoveる。 */ "MOVDQA _inData2, %xmm1 \n\t" /* 見て分かるとおり、SRC,DSTの順番ね */ "MULPS %xmm0, %xmm1 \n\t" /* 掛け算(MUL)、%xmm0(SRC)を、%xmm1(DSTに) */ "MOVDQU %xmm1, _outData \n\t" /* Alignedされてない領域弄るにはUで。 */ ); printf("%lf,%lf,%lf,%lf",outData[0],outData[1],outData[2],outData[3]); } /* * MOVDQAはalignedされている領域にしかアクセスできないけど早い(SSE2) * MOVDQUはalignedされていなくてもアクセスできるけど遅い(SSE2) * LDDQUはalignedされていなくてもアクセスできるし遅くない。でも早くもない(SSE3) */ /* * 詳しくはhttp://www.icnet.ne.jp/~nsystem/simd_tobira/index.htmlで。 * * ATOMでもSSE3までだから、まあSSE4だの5だのは当分要らないでしょ。 * * でも、一番早いのはintel compiler買って使うことだからwww */
最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!
atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!
最近アクセスの多かったページランキングです。話題のページを見に行こう!