青の部隊 505小隊 ULZ

SSE入門

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集
/*
 *	超適当な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
 */
 

タグ:

+ タグ編集
  • タグ:
ウィキ募集バナー