[英]C++ convert SSE code to AVX
在你的幫助下,我在我的代碼(下面的示例)中使用了SSE,顯着提升了性能,我想知道是否可以通過使用AVX的256位寄存器來提高這種提升。
int result[4] __attribute__((aligned(16))) = {0};
__m128i vresult = _mm_set1_epi32(0);
__m128i v1, v2, vmax;
for (int k = 0; k < limit; k += 4) {
v1 = _mm_load_si128((__m128i *) & myVector[positionNodeId + k]);
v2 = _mm_load_si128((__m128i *) & myVector2[k]);
vmax = _mm_add_epi32(v1, v2);
vresult = _mm_max_epi32(vresult, vmax);
}
_mm_store_si128((__m128i *) result, vresult);
return max(max(max(result[0], result[1]), result[2]), result[3]);
所以,我有3個問題:如何將上述相當簡單的SSE代碼轉換為AVX? 我應該導入什么標題? 我應該用什么標志告訴我的gcc編譯器(而不是-sse4.1)讓AVX工作?
提前致謝。 您的幫助。
1.) This code can be easily converted to AVX2 (see below)
2.) #include <x86intrin.h>
3.) compile with -mavx2
您將需要一個支持AVX2的CPU。 目前只有Intel Haswell處理器支持此功能。 我還沒有Haswell處理器,所以我無法測試代碼。
int result[8] __attribute__((aligned(32))) = {0};
__m256i vresult = _mm256_set1_epi32(0);
__m256i v1, v2, vmax;
for (int k = 0; k < limit; k += 8) {
v1 = _mm256_load_si256((__m256i *) & myVector[positionNodeId + k]);
v2 = _mm256_load_si256((__m256i *) & myVector2[k]);
vmax = _mm256_add_epi32(v1, v2);
vresult = _mm256_max_epi32(vresult, vmax);
}
return horizontal_max_Vec8i(vresult);
//_mm256_store_si256((__m256i *) result, vresult);
//int mymax = result[0];
//for(int k=1; k<8; k++) {
// if(result[k]>mymax) mymax = result[k];
//}
//return mymax;
編輯:我懷疑,因為你只運行超過64個元素,水平最大值有一個小但不是無意義的計算時間。 我想出了一個horizontal_max_Vec4i
功能SSE和horizontal_max_Vec8i
的AVX功能(它不需要AVX2)。 嘗試用horizontal_max_Vec4i
替換max(max(max(result[0], result[1]), result[2]), result[3])
。
int horizontal_max_Vec4i(__m128i x) {
__m128i max1 = _mm_shuffle_epi32(x, _MM_SHUFFLE(0,0,3,2));
__m128i max2 = _mm_max_epi32(x,max1);
__m128i max3 = _mm_shuffle_epi32(max2, _MM_SHUFFLE(0,0,0,1));
__m128i max4 = _mm_max_epi32(max2,max3);
return _mm_cvtsi128_si32(max4);
}
int horizontal_max_Vec8i(__m256i x) {
__m128i low = _mm256_castsi256_si128(x);
__m128i high = _mm256_extractf128_si256(x,1);
return horizontal_max_Vec4i(_mm_max_epi32(low,high));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.