如何使用不相关的数据加速for循环



下面是一个将整数数组传递给for循环的非常简单的示例。如果这些整数彼此无关,我如何使其成为一个";对于循环";同时迭代所有这些?

int waffles[3] = { 0 };
for (int i = 0; i < 3; i++) {
waffles[i] = i;
}

我得到的

时钟1:华夫饼[0]=0;

时钟2:华夫饼[1]=1;

时钟3:华夫饼[2]=2;

我想要什么

时钟1:华夫饼[0]=0,华夫饼[1]=1,华夫饼干[2]=2

这实际上可以使用类似AVX指令的SIMD指令来完成,尽管实现起来并不简单。你可能想100%地确保你被一个特定的循环所束缚,并且真的需要提高那里的性能。

这可能会有所帮助https://stackoverflow.blog/2020/07/08/improving-performance-with-simd-intrinsics-in-three-use-cases/

(我知道这不是一个完整的答案,但我还不能发表评论,这可能会有所帮助(

François Andrieux评论指出:

编译器很可能会将该循环展开为目标平台最有效的形式。

在Godbolt的Compler Explorer中查看此代码的编译方式。

Clang使用相同的指令放入0和1:

movabs  rax, 4294967296
mov     qword ptr [rsp + 12], rax
mov     dword ptr [rsp + 20], 2

gcc使用相同的指令放入1和2:

mov     DWORD PTR [rsp], 0
mov     QWORD PTR [rsp+4], rax

更大的数组将导致向量化指令一次放入更多数据(见此处(

最新更新