使用intel内在函数加载内存中等距的双精度数?

Posted

技术标签:

【中文标题】使用intel内在函数加载内存中等距的双精度数?【英文标题】:Loading doubles that are equally spaced in memory using intel intrinsics? 【发布时间】:2020-03-24 15:17:06 【问题描述】:

是否有像 _mm256_load_pd 这样的内在函数加载内存中等距的双精度数?

基本上,我正在尝试加载矩阵的列向量而不是行向量。

【问题讨论】:

不,SIMD 仅适用于连续内存。无论您使用硬件收集还是手动随机播放,收集负载的效率都不是很高。没有跨步加载指令。如果您尝试编写 matmul,则跨列不是有效实现的一部分。 【参考方案1】:

像这样考虑内在函数并没有什么意义。加载内在函数用于将一块数据直接从内存中的一个位置放入可以直接加载到寄存器中的数据类型。您不能这样做,因为您要操作的数据不是连续的。

最简单的方法就是:

__m256d data;
for(int i = 0; i < 4; i++)

   data[i] = myarray[/* some index derived from i*/]

【讨论】:

请注意,用[] 索引__m256d 仅适用于GNU C,它根据GNU C 本机向量语法定义__m256d。 MSVC 以不同的方式定义__m256d(作为不同类型数组的联合)。无论如何,是的,这是进行跨步加载的一种方法,并且可以尽可能高效地编译。但那是“不太”;更好地规划你的矢量化,所以你不需要这个,例如最坏的情况是根据需要转置数组的小块,用于缓存阻塞。 啊,有趣的是,我主要是一名 Linux 开发人员,所以我不知道 re: 未定义运算符。正如你所说,最好通过将你的矩阵。

以上是关于使用intel内在函数加载内存中等距的双精度数?的主要内容,如果未能解决你的问题,请参考以下文章

将未对齐的双精度数加载到 _m128d 寄存器中

如何在小数点后将 Dart 中的双精度数舍入到给定的精度?

使用 Intel 内在函数的位反向重新排序优化

使用 intel 内在函数将压缩的 8 位整数乘以浮点向量

intel fortran 编译错误“此内在函数在常量表达式中无效”

SSE 将整数加载到 __m128