下面是一个将整数数组传递给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
更大的数组将导致向量化指令一次放入更多数据(见此处(