这个问题真的很让人好奇。
我正在将一个例程转换为 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/