我尝试将#pragma omp simd应用于以下代码(循环),但似乎不起作用(没有速度提升)。我也尝试了#pragma omp simd linear,但是我所有的尝试都导致了seg错误。
https://github.com/Rdatatable/data.table/blob/master/src/fsort.c#L209 https://github.com/Rdatatable/data.table/blob/master/src/fsort.c#L184
有没有可能用simd递增一个向量?示例:
#include <stdio.h>
#include <stdlib.h>
int main() {
int len = 1000;
int tmp[len];
for(int i=0; i<len; ++i) {
tmp[i]=rand()%100;
}
int *thisCounts = (int *) calloc(len, sizeof(int));
for (int j=0; j<len; ++j) {
thisCounts[tmp[j]]++;
}
for (int j=0; j<len; ++j) {
printf("%d, ",thisCounts[j]);
}
free(thisCounts);
return 0;
}仅供参考,209行是花费时间最多的一行,我正在努力改进。
谢谢
发布于 2021-06-07 03:25:26
这取决于目标硬件体系结构。许多处理器体系结构不具有执行这种间接访问的SIMD指令。在主流x86-64处理器上,有一个分散/聚集指令来执行这样的计算。然而,它们没有被有效地实现,因此没有比使用非SIMD指令快很多。此外,在这里使用它们是困难的,因为可能存在一些增量冲突(如果是tmp[j1] == tmp[j2] with j1 != j2。AVX-512 SIMD指令集包含用于此目的的有趣指令,但它仅在最近几个处理器上可用。这同样适用于带有SVE/SVE2的ARM,这是非常新的,在绝大多数ARM处理器上还不可用。
因此,简而言之,您的处理器可能会使用SIMD指令做到这一点,但这并不意味着它在所有架构上都是不可能的。还要注意,由于可能的冲突,在这里使用#pragma omp simd可能是不正确的。还请注意,此操作的速度可能依赖于许多现代处理器上的输入数据(随机数据的行为与大多数现实世界中可能的输入不同)。
https://stackoverflow.com/questions/67860992
复制相似问题