4つの32ビット整数に別の4つの整数を掛ける方法は?それができる命令は見つかりませんでした。
14081 次
2 に答える
25
符号付きの32x32ビット整数乗算が必要な場合は、 software.intel.comの次の例で、必要な処理が実行されるように見えます。
static inline __m128i muly(const __m128i &a, const __m128i &b)
{
__m128i tmp1 = _mm_mul_epu32(a,b); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32( _mm_srli_si128(a,4), _mm_srli_si128(b,4)); /* mul 3,1 */
return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0))); /* shuffle results to [63..0] and pack */
}
古いCPU用と最近のCPU用の2つのビルドが必要になる場合があります。その場合、次のように実行できます。
static inline __m128i muly(const __m128i &a, const __m128i &b)
{
#ifdef __SSE4_1__ // modern CPU - use SSE 4.1
return _mm_mullo_epi32(a, b);
#else // old CPU - use SSE 2
__m128i tmp1 = _mm_mul_epu32(a,b); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32( _mm_srli_si128(a,4), _mm_srli_si128(b,4)); /* mul 3,1 */
return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0))); /* shuffle results to [63..0] and pack */
#endif
}
于 2012-05-08T15:19:23.873 に答える
8
SSE 4.1のPMULLDは、これを実行します。
説明は少し誤解を招きやすく、符号付き乗算について説明していますが、格納されるのは下位32ビットのみであるため、実際には、のように両方に使用できる符号を無視する命令ですIMUL
。
于 2012-05-08T14:42:16.120 に答える