c - Openmp simd(增量向量)
问题描述
我试图应用#pragma omp simd
到以下代码(循环),但它似乎不起作用(没有速度提高)。我也尝试过#pragma omp simd linear
,但我所有的尝试都导致了段错误。
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 行是最耗时的,我正在努力改进。
谢谢
解决方案
这取决于目标硬件架构。许多处理器架构没有 SIMD 指令来执行这种间接访问。在主流 x86-64 处理器上,有一个 scatter/gather 指令来执行这样的计算。但是,它们的实现效率不高,因此并不比使用非 SIMD 指令快得多。此外,在这里使用它们很困难,因为可能存在一些增量冲突(如果tmp[j1] == tmp[j2] with j1 != j2
。AVX-512 SIMD 指令集包含有趣的指令,但它仅在少数最近的处理器上可用。同样适用于具有 SVE/SVE2 的 ARM,即非常新,在绝大多数 ARM 处理器上尚不可用。
因此,简而言之,您的处理器使用 SIMD 指令执行此操作的可能性很小,但这并不意味着它在所有架构上都不可能。另请注意,#pragma omp simd
由于可能存在冲突,此处使用可能不正确。另请注意,此操作的速度可能取决于许多现代处理器上的输入数据(随机数据的行为与大多数现实世界可能的输入不同)。
推荐阅读
- python - 在 Python 中的类之外定义类方法
- java - Java Web Start 拒绝自签名证书
- javascript - 'self' 脚本被阻止加载,但是当我使用 nonce 时它们可以工作吗?
- python - Python 长度不匹配
- javascript - 使用 JavaScript 制作添加到收藏夹按钮
- javascript - 从右侧滚动时,图表 js 确实滚动到左侧隐藏区域
- azure-ad-b2c - Azure B2C 的 Android 示例文件也需要在 B2CConfiguration 类中复制配置文件信息
- c# - a* (astar) 寻路问题:我无法从其他脚本中引用变量以确定 aipath 目标
- java - 如何为 BST 节点创建构造函数?
- php - 如何替换 file_get_contents 中的变量以使用 PHP 生成 css 文件?