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

标签 c++

我一直在编写执行矩阵运算的代码。最初它仅适用于 x86,现在正在将其移植到不同的体系结构。另外,我希望它支持 float 以外的不同数据类型。

考虑以下添加到 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);
        }
}

这是我想到的改进代码以支持多种平台和数据类型的方法。

  1. 对于不同的数据类型,我打算将函数更改为模板函数

  2. 对于 simd 指令,我想到了使用宏将所有特定于体系结构的内部函数重命名为通用 simd 指令,例如 SIMD_ADD 。问题在于不同的数据类型需要不同的内部函数,并且内部函数的返回类型也取决于数据类型。

  3. 此外,如果我要编写一个减法函数,我最终会复制大部分代码,只是为了用 SIMD_SUB 宏替换 SIMD_ADD 宏。它们是否是一种巧妙的方法,以至于我不必为所有元素明智的操作(例如乘法、除法和减法)重复相同的代码?

如何在不抽象到影响代码性能的情况下解决第 2 点和第 3 点?

最佳答案

我最终得到了 simd 指令的模板类,每个数据类型都有专门化。不幸的是,编译器不会自动内联它,因此您必须使用编译器特定的属性来强制它内联

关于c++ - 如何抽象 SIMD 代码以在不影响性能的情况下处理不同的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50080280/

相关文章:

c++ - QML Camera 的无效/未定义媒体对象属性

c++ - 在非成员函数中声明全局变量

c++ - Lambda 转换函数指针比较

C++11 线程段错误

c++ - 初始化静态 const 变量为我提供了非模板 const 的模板定义

c++ - 可变参数模板未在 MSVC 中编译?

c++ boost导致崩溃

c++ - 如何将某个父类的所有子类注册到不同的类

c++ - Qt 项目管理与子项目 : Accessing classes from another project

c++ - Vulkan 计算着色器不会在无限循环上停止