SIMD命令およびアセンブラの基礎 SIMDとは 用語集 開発環境 アセンブラの基礎知識 x87 FPU命令を使用したプログラミング CPUの識別 メモリアドレスのアライメント ラップアラウンド算術と飽和算術 SIMD命令セットの分類と歴史 SIMD命令セットの記述方法 SIMD命令セットの概要 MMX命令セットの概要 SSE命令セットの概要 SSE2命令セットの概要 SSE3命令セットの概要 SSE4命令セットの概要 命令リファレンス データ転送命令 算術命令 比較命令 論理演算命令 シフト命令 シャッフル命令 パックおよびアンパック命令 変換命令 挿入および抽出命令 ブレンド命令 丸め命令 キャッシュ制御命令 その他の命令 プログラミング例 画像処理 音声信号処理 参考資料 参考資料 トップSIMDの扉
はじめに x86が持ち合わせる汎用レジスタ(eax、ecxなど…)を覚えているでしょうか。これらを用いれば、32ビットまでの整数型の演算を行うことが可能です。ほとんどのプログラムはこれらの汎用レジスタを活用することでネイティブコード化を行うことが可能ですが、実は一つ二つ、不可能な問題もあるのです。 それは浮動小数演算。ネイティブコードで浮動小数演算を行う場合、汎用レジスタを使うわけにはいきません。そもそもx86の汎用レジスタは32ビットまでしか表現できないため、倍精度浮動小数点(64ビット)を扱うことができません。かろうじて単精度浮動小数点であれば汎用レジスタで値を保有することができますが、肝心な浮動小数点用の命令がx86の汎用レジスタ用には用意されていないのです。 そこで登場するのがSSE2になります。これらは64ビット・128ビットなど、汎用レジスタでは表現不可能な整数演算を高速に行っ
strlen()とmemchr()のSIMD版を作ってみました. 今回は最速よりもお手軽さを重視したのでアセンブリ言語ではなくintrinsic関数を使っています.そのためVisual Studio 2008, gcc 4.xの両方でコンパイルでき32-bit, 64-bit OS上で動作します. WindowsとLinuxでのみ確認していますが恐らくIntel Mac OS X上でも動作するでしょう(sample source). ベンチマークはランダムな長さの文字列の平均長(average length)を変化させつつ取りました.数値は1byteあたりにかかった処理時間比で小さいほど速いことを表します. strlenが3種類(ANSI, BLOG, SSE2)とmemchrが2種類(ANSI, SSE2)あります.BLOGというのは今回試してみようというきっかけになったCounting
Abstract: Using new Intel Core i7 instructions to speed up string manipulation. Created 15 years ago by Peter Kankowski Last changed 14 years ago Contributors: Dap and Adam Messinger Filed under Low-level code optimization The new instructions SSE 4.2 introduces four instructions (PcmpEstrI, PcmpEstrM, PcmpIstrI, and PcmpIstrM) that can be used to speed up text processing code (including strcmp, m
6.1 はじめに 第5章で説明したデバッグウインドウもどきのプログラムの中で、stosbという命令を使いました。 このstosb命令は、ストリング操作命令と呼ばれる命令の一つです。 ストリング操作命令には、stosbの他にmovsb, cmpsb, scasb等の命令があります。 ストリング操作命令は、その名の通り主に文字列の操作に利用される命令ですが、実は画像処理においても有用な命令です。 そこで、第6章ではストリング操作命令を使った簡単な文字列操作の例を示し、次の第7章では画像処理の例を示したいと思います。 6.2 ストリング操作命令の種類 ストリング操作命令には、大きく分けるとmovs, stos, lods, cmps, scasの5種類があります。 これらは、さらに細かく分けると全部で15種類の命令があります。 命令の末尾にbが付いていて、1バイトずつ処理をするのが、movsb,
strlen()とmemchr()のSIMD版を作ってみました. 今回は最速よりもお手軽さを重視したのでアセンブリ言語ではなくintrinsic関数を使っています.そのためVisual Studio 2008, gcc 4.xの両方でコンパイルでき32-bit, 64-bit OS上で動作します. WindowsとLinuxでのみ確認していますが恐らくIntel Mac OS X上でも動作するでしょう(sample source). ベンチマークはランダムな長さの文字列の平均長(average length)を変化させつつ取りました.数値は1byteあたりにかかった処理時間比で小さいほど速いことを表します. strlenが3種類(ANSI, BLOG, SSE2)とmemchrが2種類(ANSI, SSE2)あります.BLOGというのは今回試してみようというきっかけになったCounting
今回は宿題となっていたmmx命令のmovntqについて試してきました。この命令は連載の中で紹介したsse命令のmovntdqと似た働きをしますが、一度に処理できるデータ量が8バイトと少ない代わりにアライメントの制約を受けないと言うメリットがあります。この辺のメリットとデメリットがどう作用するかを試してきました。
リスト5 ceil関数の処理速度測定コード float* A; float* B; int n; int dim = 1024*1024*100; LARGE_INTEGER freq, begin, end; srand(1111); for( n = 0; n < dim; n++ ) { A[n] = (float)rand() / (float)(RAND_MAX); } QueryPerformanceFrequency( &freq ); QueryPerformanceCounter( &begin ); for( i = 0; i < dim; i++ ) { B[i] = ceil(A[i]); } QueryPerformanceCounter( &end ); printf( "ceil: %f sec.\n", ( (double)(end.QuadPart - b
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く