首页 > 解决方案 > 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 行是最耗时的,我正在努力改进。

谢谢

标签: cparallel-processinghistogramopenmpsimd

解决方案


这取决于目标硬件架构。许多处理器架构没有 SIMD 指令来执行这种间接访问。在主流 x86-64 处理器上,有一个 scatter/gather 指令来执行这样的计算。但是,它们的实现效率不高,因此并不比使用非 SIMD 指令快得多。此外,在这里使用它们很困难,因为可能存在一些增量冲突(如果tmp[j1] == tmp[j2] with j1 != j2。AVX-512 SIMD 指令集包含有趣的指令,但它仅在少数最近的处理器上可用。同样适用于具有 SVE/SVE2 的 ARM,即非常新,在绝大多数 ARM 处理器上尚不可用。

因此,简而言之,您的处理器使用 SIMD 指令执行此操作的可能性很小,但这并不意味着它在所有架构上都不可能。另请注意,#pragma omp simd由于可能存在冲突,此处使用可能不正确。另请注意,此操作的速度可能取决于许多现代处理器上的输入数据(随机数据的行为与大多数现实世界可能的输入不同)。


推荐阅读