【发布时间】:2020-03-24 15:17:06
【问题描述】:
是否有像 _mm256_load_pd 这样的内在函数加载内存中等距的双精度数?
基本上,我正在尝试加载矩阵的列向量而不是行向量。
【问题讨论】:
-
不,SIMD 仅适用于连续内存。无论您使用硬件收集还是手动随机播放,收集负载的效率都不是很高。没有跨步加载指令。如果您尝试编写 matmul,则跨列不是有效实现的一部分。
标签: c++ intrinsics
是否有像 _mm256_load_pd 这样的内在函数加载内存中等距的双精度数?
基本上,我正在尝试加载矩阵的列向量而不是行向量。
【问题讨论】:
标签: c++ intrinsics
像这样考虑内在函数并没有什么意义。加载内在函数用于将一块数据直接从内存中的一个位置放入可以直接加载到寄存器中的数据类型。您不能这样做,因为您要操作的数据不是连续的。
最简单的方法就是:
__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(作为不同类型数组的联合)。无论如何,是的,这是进行跨步加载的一种方法,并且可以尽可能高效地编译。但那是“不太”;更好地规划你的矢量化,所以你不需要这个,例如最坏的情况是根据需要转置数组的小块,用于缓存阻塞。