将整数数组加载到 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 寄存器?

基于标量整数条件的AVX向量寄存器的条件移动(cmov)?

用于灰度到 ARGB 转换的 C++ SSE2 或 AVX2 内在函数

AVX2 1x mm256i 32bit 到 2x mm256i 64bit