将整数数组加载到 AVX 寄存器中
Posted
技术标签:
【中文标题】将整数数组加载到 AVX 寄存器中【英文标题】:Load Array of Integers into AVX Register 【发布时间】:2014-09-10 11:19:01 【问题描述】:我目前正在研究 AVX Intrinsics 以并行化我的代码。 至于现在,我想写一个基准测试,看看我能获得多少加速。
void randomtable (uint32_t crypto[4][64])
int k = 1;
for (int i=0;i<4;i++)
k++;
for (int j=0;j<64;j++)
crypto[i][j]= (k+j)%64;
int main (void)
uint32_t crypt0[4][64];
randomtable(crypt0);
__m256i ymm0 = _m256_load_si256(&crypt0[0][0]);
我的问题和疑问是如何将数组的前 8 个元素加载到 ymm0 中?
我正在使用 gcc -mavx -march=native -g -O0 -std=c99 进行编译
编译错误:错误:使用类型“int”初始化类型“__m256i”时类型不兼容
【问题讨论】:
您似乎已经在使用_mm256_load_si256
执行此操作(除了明显的错字)-您能否更具体地了解实际问题?
我得到一个编译错误。使用 GCC。 -mavx 和 -march=native 设置为 CFLAGS......错误:使用类型 'int' 初始化类型 '__m256i' 时类型不兼容
好的 - 请参阅下面的答案...
【参考方案1】:
此行有错字,缺少演员表:
__m256i ymm0 = _m256_load_si256(&crypt0[0][0]);
应该是:
__m256i ymm0 = _mm256_load_si256((__m256i *)&crypt0[0][0]);
请注意,如果您想对数据进行进一步处理(即整数运算等),您可能需要使用 AVX2,因此您应该使用 -mavx2
进行编译。
【讨论】:
@PaulR - 可以将链表加载到 AVX 寄存器中还是必须是数组? @gansub:SIMD 最适用于连续数据,即数组。另请注意,链表往往具有低效的缓存/内存访问模式,因此对于性能关键型应用程序,它们通常使用数组和索引而不是通常的动态分配结构和指针来实现。以上是关于将整数数组加载到 AVX 寄存器中的主要内容,如果未能解决你的问题,请参考以下文章
将 2x4 64b 结构的第一行加载到 AVX2 的 256b 寄存器中的最快方法是啥?
SIMD (AVX2) - 将 uint8_t 值加载到多个浮点 __m256 寄存器
如何将 AVX512 寄存器 zmm26 中的 QuadWord 写入 rax 寄存器?