如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
How to Abstract SIMD code to handle different datatypes without a performance hit
我一直在编写用于执行矩阵操作的代码。最初,它仅适用于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);
}
}
这是我考虑的改进代码以支持多种平台和数据类型的代码。
对于不同的数据类型,我将将函数更改为模板函数
对于SIMD指令,我想到拥有将所有架构特定特定固有函数重命名为simd simd_add等通用simd指令的宏。问题是不同的数据类型需要不同的固有函数,并且内在的返回类型也取决于数据类型。
同样,如果我要编写减去功能,我最终将复制大多数代码,只是为了替换simd_add宏的simd_sub宏。它们的整洁方式使我不必重复所有元素操作的相同代码,例如乘法,除法和减法?
一个人将如何应对点2&amp;3不抽象影响代码的性能?
我最终为每个数据类型提供了专业化的SIMD指令的模板类。不幸的是,编译器不会自动内联,因此您必须使用编译器特定属性将其迫使它限制为inline
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何抽象模板函数中使用的 simd 代码
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 手动SIMD代码可负担性
- 在使用英特尔内部函数对 SIMD 代码进行编程时,如何强制使用 vmovapd 而不是 vmovupd?
- SIMD/SSE代码在Windows 8上清楚地运行在Windows 7和Linux上
- 使用 SIMD 管理累积(单个)值的清理代码循环的方法是什么
- GCC -msse2 不会生成 SIMD 代码
- 如何使用 gcc 编译 SIMD 代码
- 为什么我的散点代码的性能比Vc SIMD更好