首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Openmp simd (增量向量)

Openmp simd (增量向量)
EN

Stack Overflow用户
提问于 2021-06-06 23:50:17
回答 1查看 118关注 0票数 0

我尝试将#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递增一个向量?示例:

代码语言:javascript
复制
#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行是花费时间最多的一行,我正在努力改进。

谢谢

EN

回答 1

Stack Overflow用户

发布于 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可能是不正确的。还请注意,此操作的速度可能依赖于许多现代处理器上的输入数据(随机数据的行为与大多数现实世界中可能的输入不同)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67860992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档