如果你有AVX2然後可以使用_mm256_permutevar8x32_ps
:
#define _mm256_selectidx(v, i) _mm256_permutevar8x32_ps(v, _mm256_set1_epi32(i))
顯然,這將產生幾個指令,這取決於你的編譯器如何處理_mm256_set1_epi32
以及是否元素索引是一個編譯時間常數或沒有。
演示:
#include <stdio.h>
#include <immintrin.h>
#define _mm256_selectidx(v, i) _mm256_permutevar8x32_ps(v, _mm256_set1_epi32(i))
int main(void)
{
__m256 v0 = _mm256_setr_ps(2, 3, 4, 5, 6, 7, 8, 9);
__m256 v1 = _mm256_selectidx(v0, 2);
float f0[8], f1[8];
_mm256_storeu_ps(f0, v0);
_mm256_storeu_ps(f1, v1);
printf("v0: %g %g %g %g %g %g %g %g\n", f0[0], f0[1], f0[2], f0[3], f0[4], f0[5], f0[6], f0[7]);
printf("v1: %g %g %g %g %g %g %g %g\n", f1[0], f1[1], f1[2], f1[3], f1[4], f1[5], f1[6], f1[7]);
return 0;
}
測試:
$ gcc -Wall -mavx2 test_avx2_select.c && ./a.out
v0: 2 3 4 5 6 7 8 9
v1: 4 4 4 4 4 4 4 4
是元素的索引(2在你上面的例子)編譯時間常量,或它是否需要成爲運行時間值(即變量)? – 2014-10-01 12:35:58
這是一個立即值/常數 – Shaggi 2014-10-01 13:36:53