c++ - 从二阶导数计算的曲线的 SIMD 优化

标签 c++ optimization vectorization simd

这个问题真的很让人好奇。

我正在将一个例程转换为 SIMD 指令(我对 SIMD 编程还很陌生),并且在使用以下代码时遇到了麻烦:

// args:
uint32_t phase_current;
uint32_t phase_increment;
uint32_t phase_increment_step;

for (int i = 0; i < blockSize; ++i)
{
    USEFUL_FUNC(phase_current);
    phase_increment += phase_increment_step;
    phase_current += phase_increment;
}

问题:假设 USEFUL_FUNC有一个 SIMD 实现,我只是想计算一个正确的 vector phase_current对于处理,处理phase_current的正确方法是什么?依赖于其先前的值(value)?

反过来,一个函数式编程fold -like 实现将同样有用,因为我试图了解如何提升数据依赖性,而不是为了优化而尝试优化。

最后,如果你能推荐一些文学作品,请推荐。不知道如何谷歌这个主题。

最佳答案

我唯一能想到的是水平添加。假设您有一个内容为 {pc, 0, pi, pis} 的 __m128i vector 。然后首先 HADD 将它变成
{pc, pi + pis},第二个 HADD 会变成 pc + pi + pis .

HADD 一次在两个 __m128i 上运行,因此可以提高一些速度。

但是交错指令使得管道总是满的不会是一项微不足道的练习。 HADD 链接:https://msdn.microsoft.com/en-us/library/bb531452(v=vs.120).aspx

让我添加链接到非常有用的讨论 wrt HADD for floats。很多代码和结论可以直接应用于整数HADD:Fastest way to do horizontal float vector sum on x86

关于c++ - 从二阶导数计算的曲线的 SIMD 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47983660/

相关文章:

c++ - 为什么这个 PP_ARG_COUNT 宏需要一个 PP_EXPAND?

html - 如何使用 CSS 使社交分享按钮显示为内联 block ?

optimization - Postgres 将字符串转换为数字

python - 更改多行数组的numpy矢量化方式(行可以重复)

matlab - 在matlab中检查没有for循环的数组中的成员资格

c++ - 用于 C++ 的 Win32 CRITICAL_SECTION 的轻量级跨平台替代品?

c++ - 如何使用抽象类指针避免内存泄漏

c++ - 渲染 SketchUp 模型 API

php - 存储过程与否?

matlab - 检查数据是否存在于另一个矩阵中,如果存在,则替换它