我一直在编写用于执行矩阵运算的代码。最初它只适用于x86,现在正将它移植到不同的架构中。此外,我希望它支持浮动以外的不同数据类型。
请考虑以下代码以添加到float数组
void add(float *a, float *b, float *dst, int len)
{
int k = 0;
for(; k + 8 < len; k += 8,a += 8, b += 8, dst+= 8){
__m256 x = _mm256_load_ps(a);
__m256 y = _mm256_load_ps(b);
__m256 z = _mm256_add_ps(x, y);
_mm256_store_ps(dst, z);
}
}
以下是我想到的改进代码以支持多种平台和数据类型。
如果没有抽象到影响代码性能的程度,人们如何处理第2点和第3点?
我最终得到了simd指令的模板类,每个数据类型都有一个专门化。遗憾的是,编译器不会自动内联它,因此您必须使用编译器特定的属性来强制它内联