Multiicore Prograamming SID
SIM紹介
single instruction multile dataは一つの命令で複数の同じ操作を実行します.例えば、128ビットの浮動小数点演算の場合、128ビットは同時に4セットのfloatタイプのデータ演算を計算することができる.このような演算SSEは、intelのプロセッサにおいて定義されている.
SSEの命令(Streaming SID Extensions)
コマンドセットは、64 bitのMMX、128 bitのSSE、256 bitのAVX、512は、彼のAVX-512よりもヘッダファイルを使用して、すべてのコマンドを使用することができます.具体的なヘッダファイルの参考:
http://www.cnblogs.com/wangguchangqing/p/5466301.html
AVX-512コマンドセットは512ビットのレジスタがあり、Intrinicに対応するデータは512ビットもあります.具体的なデータの種類とその説明は以下の通りです.
同前m 64ビットに対応するデータタイプは、MMXコマンドセットのみで使用できる.MMXコマンドセットはSSEコマンドセットの128ビットレジスタも使用できるので、このタイプは使用する場合が少ない.m 128/_ひm 128 i/_u um 128 dの3つのデータタイプはいずれも128ビットのデータタイプです.SSEコマンドセットは、整数を操作することができ、浮動小数点タイプ(単精度と二重精度)を操作することができますので、この3つのタイプは、サフィックスによって異なるタイプの操作数を表します.m 128はシングル精度浮動小数点、__um 128 iは整体型で、_u um 128 dはダブル精度浮動小数点です.256と512のデータタイプと128ビットの数だけを変えます.
関数名
第一部はプレフィックス(u)です.mmは、SSEコマンドセットに対応するIntrinic関数を表します._mm 256または_mm 512はAVX、AVX-512コマンドセットのIntrinic関数プレフィックスである.第二部分は対応する命令の操作であり、_add,_ムッシュロードなど、16ビット未満の配置された動作数をレジスタにロードするなどの修繕子がある場合があります.第三部分は操作の対象名とデータタイプ、_ps packed操作のすべての単精度浮動小数点数;upd packed操作の全てのダブル精度浮動小数点数;upixx(xxは長さで、8、16、32、64)packedはすべてのxxビットを操作して符号の整数があって、使うレジスタの長さは64ビットです.epixx(xxは長さ)packedはすべてのxxビットの符号付き整数を操作し、使用するレジスタの長さは128ビットである.epuxx packedはすべてのxxビットの符号無し整数を操作します.ss操作の最初のシングル精度の浮動小数点数.
この説明は以下から来ています.
http://www.cnblogs.com/wangguchangqing/p/5466301.html
例を挙げて適用する
void ComputeArrayWithSSE(
float* a1, // [in] first source array
float* a2, // [in] second source array
float* res, // [out] result array
int size) // [in] size of all arrays
{
int numLoop = size >> 2;
__m128 m1, m2, m3, m4;
__m128* pSrc1 = (__m128*) a1;
__m128* pSrc2 = (__m128*) a2;
__m128* pDest = (__m128*) res;
__m128 m0_5 = _mm_set_ps1(0.5f); // m0_5[0, 1, 2, 3] = 0.5
for ( int j = 0; j < numLoop; j++ )
{
m1 = _mm_mul_ps(*pSrc1, *pSrc1); // m1 = *pSrc1 * *pSrc1
m2 = _mm_mul_ps(*pSrc2, *pSrc2); // m2 = *pSrc2 * *pSrc2
m3 = _mm_add_ps(m1, m2); // m3 = m1 + m2
m4 = _mm_sqrt_ps(m3); // m4 = sqrt(m3)
*pDest = _mm_add_ps(m4, m0_5); // *pDest = m4 + 0.5
pSrc1++;
pSrc2++;
pDest++;
}
}
参照リンク:intelの命令集の説明:https://software.intel.com/sites/default/files/managed/a4/60/325383-sdm-vol-2abcd.pdf
http://blog.csdn.net/chenchong_219/articale/detail/44683155
https://msdn.microsoft.com/zh-cn/library/ayeb3ayc.aspx
http://www.cnblogs.com/wangguchangqing/p/5466301.html
http://stackoverflow.com/questions/18638051/using-avx-with-gcc-avxintrin-h-missing
AVXの紹介:
http://blog.csdn.net/fengbingchun/article/details/23598709
http://stackoverflow.com/questions/32612190/how-to-solve-the-32-byte-alignment-issue-for-avx-load-store-operations
https://software.intel.com/zh-cn/forums/intel-isa-extensions/topic/515997
https://neal.hackpad.com/ep/pad/static/W3RmB2yYv3E
https://software.intel.com/zh-cn/articles/avoiding-avx-sse-transition-penalties/