C++ 如何在不影响性能的情况下抽象SIMD代码以处理不同的数据类型
我一直在编写执行矩阵运算的代码。最初它只用于x86,现在我将它移植到不同的体系结构。另外,我希望它支持除float之外的不同数据类型 考虑以下添加到浮点数组的代码C++ 如何在不影响性能的情况下抽象SIMD代码以处理不同的数据类型,c++,C++,我一直在编写执行矩阵运算的代码。最初它只用于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_lo
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);
}
}
void add(浮点*a、浮点*b、浮点*dst、整数长度)
{
int k=0;
对于(;k+8
下面是我对改进代码以支持多种平台和数据类型的想法
如何在不抽象到影响代码性能的程度的情况下处理第2点和第3点?我最终为simd指令创建了模板类,并对每种数据类型进行了专门化。不幸的是,编译器不会自动内联它,因此您必须使用编译器特定的属性强制它内联我完全忘记了c++11中引入的auto。因此,第2点不再是一个问题,目前可能没有任何帮助,但C++20可能有帮助。