Multiicore Prograamming SID


  • SID紹介
  • SSEの命令Streaming SID Extensions
  • 関数名
  • アプリケーション例
  • 転載は出典を明記してください.http://blog.csdn.net/c602273091/article/details/55045956
    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/