【发布时间】:2017-03-13 12:18:30
【问题描述】:
我想知道将 256 位长 AVX 向量存储为 4 个 64 位无符号长整数的最佳方法是什么。根据https://software.intel.com/sites/landingpage/IntrinsicsGuide/ 网站上写的功能,我只能想办法使用 maskstore(下面的代码)来做到这一点。但这是最好的方法吗?还是有其他方法可以做到这一点?
#include <immintrin.h>
#include <stdio.h>
int main() {
unsigned long long int i,j;
unsigned long long int bit[32][4];//256 bit random numbers
unsigned long long int bit_out[32][4];//256 bit random numbers for test
for(i=0;i<32;i++){ //load with 64 bit random integers
for(j=0;j<4;j++){
bit[i][j]=rand();
bit[i][j]=bit[i][j]<<32 | rand();
}
}
//--------------------load masking-------------------------
__m256i v_bit[32];
__m256i mask;
unsigned long long int mask_ar[4];
mask_ar[0]=~(0UL);mask_ar[1]=~(0UL);mask_ar[2]=~(0UL);mask_ar[3]=~(0UL);
mask = _mm256_loadu_si256 ((__m256i const *)mask_ar);
//--------------------load masking ends-------------------------
//--------------------------load the vectors-------------------
for(i=0;i<32;i++){
v_bit[i]=_mm256_loadu_si256 ((__m256i const *)bit[i]);
}
//--------------------------load the vectors ends-------------------
//--------------------------extract from the vectors-------------------
for(i=0;i<32;i++){
_mm256_maskstore_epi64 (bit_out[i], mask, v_bit[i]);
}
//--------------------------extract from the vectors end-------------------
for(i=0;i<32;i++){ //load with 64 bit random integers
for(j=0;j<4;j++){
if(bit[i][j]!=bit_out[i][j])
printf("----ERROR----\n");
}
}
return 0;
}
【问题讨论】:
-
最好的办法是不要。
unsigned long不保证有 64 位。如果您需要特定的位宽(和编码),请使用来自stdint.h的固定宽度类型。 -
也许你应该看看
extract、set和insert内在函数。我不知道你想做什么。 -
@Christoph 我只想在 4、64 位整数中提取 256 个向量。我没有找到您在上述页面中提到的内在函数。
-
如果目标 64 位整数是连续的,则只需使用
_mm256_storeu_si256。 -
在 C11 中,使用
_Alignas(32) unsigned long long int bit[32][4];让编译器为您的数组对齐堆栈内存。即使您仍然使用_mm256_storeu_ps,这也有助于提高性能。