128ビットレーンで動作する命令が必要です。残念ながら、ほとんどのAVX/AVX2シャッフル/置換命令は、256ビットAVXベクトルの2つの128ビットレーン内でしか動作しませんが、この制限がないものはいくつかあります。この特定のケースでは、あなたが探している固有の_mm256_permutevar8x32_psです:
#include <stdio.h>
#include <immintrin.h>
int main(void)
{
__m256 v0 = _mm256_setr_ps(0, 1, 2, 3, 4, 5, 6, 7);
__m256i vperm = _mm256_setr_epi32(0, 1, 2, 4, 5, 6, 0, 0);
__m256 v1 = _mm256_permutevar8x32_ps(v0, vperm);
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 blackball.c
$ ./a.out
v0: 0 1 2 3 4 5 6 7
v1: 0 1 2 4 5 6 0 0
詳細はあなたがSIMD命令をアクセスするために使用しているライブラリに依存しています。私は '__m256'がいくつかのIntelのものを示していると思います。 –
@ Cheersandhth.-Alfはい、私はAVX2までをサポートするIntel CPU上でGCCを使用しています。 – blackball
Intelのドキュメントを見ているかもしれませんか?チュートリアルも必要であると私は確信しています。私はこのようなものを見たことがありません。 –