Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不影响性能的情况下抽象SIMD代码以处理不同的数据类型_C++ - Fatal编程技术网

C++ 如何在不影响性能的情况下抽象SIMD代码以处理不同的数据类型

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

我一直在编写执行矩阵运算的代码。最初它只用于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);
        }
}
void add(浮点*a、浮点*b、浮点*dst、整数长度)
{
int k=0;
对于(;k+8
下面是我对改进代码以支持多种平台和数据类型的想法

  • 对于不同的数据类型,我将把函数改为模板函数

  • 对于simd指令,我考虑使用宏将所有特定于体系结构的内部函数重命名为通用simd指令,如simd_ADD。问题是不同的数据类型需要不同的内在函数,而内在函数的返回类型也依赖于数据类型

  • 另外,如果我要编写一个减法函数,我最终会复制大部分代码,只是为了将SIMD_ADD宏替换为SIMD_SUB宏。它们是否是一种简洁的方式,使得我不必为所有元素操作重复相同的代码,比如乘法、除法和减法


  • 如何在不抽象到影响代码性能的程度的情况下处理第2点和第3点?

    我最终为simd指令创建了模板类,并对每种数据类型进行了专门化。不幸的是,编译器不会自动内联它,因此您必须使用编译器特定的属性强制它内联

    我完全忘记了c++11中引入的auto。因此,第2点不再是一个问题,目前可能没有任何帮助,但C++20可能有帮助。