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

问题描述 投票:2回答:1

我一直在编写用于执行矩阵运算的代码。最初它只适用于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);
        }
}

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

  1. 对于不同的数据类型,我打算将函数更改为模板函数
  2. 对于simd指令,我想到了将所有体系结构特定的内部函数重命名为通用simd指令(如SIMD_ADD)的宏。问题是不同的数据类型需要不同的内部函数,而内在函数的返回类型也依赖于数据类型。
  3. 另外,如果我要写一个减法函数,我最终会复制大部分代码只是为了替换SIMD_SUB宏的SIMD_ADD宏。他们是一个整洁的方式,以便我不必为所有元素明智的操作重复相同的代码,如乘法,除法和减法?

如果没有抽象到影响代码性能的程度,人们如何处理第2点和第3点?

c++
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.