【问题标题】:Openmp simd (increment vector)Openmp simd(增量向量)
【发布时间】:2021-08-23 21:51:07
【问题描述】:

我尝试将#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 行是最耗时的,我正在努力改进。

谢谢

【问题讨论】:

标签: c parallel-processing histogram openmp simd


【解决方案1】:

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

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

【讨论】:

  • 如果直方图没有大量的桶,并且可能或可能多次涉及同一桶的长时间运行,则展开多个计数数组以分解例如,如果counts[33] 必须在运行 64 个输入时增加 50 倍,则存储/重新加载串行依赖项。 (最后减少到一个数组只是一个简单的数组求和,SIMD 可以做到这一点。)示例:Methods to vectorise histogram in SIMD?
  • 你当然可以跨线程并行化,只要每个线程都有自己的计数数组(或一组计数数组)。
  • 嗯,可以通过让每个 SIMD 向量元素使用不同的数组来跳过冲突检测:对于输入向量,添加一个类似 [0, n, 2n, 3n, ...] 的向量以使每个 SIMD 元素使用不同的一个大阵列的区域。仅适用于 SIMD 分散 (AVX-512 / SVE),或者可能适用于 SIMD 收集/手动分散,但您必须在标量代码中重做存储寻址。
  • 是的,复制每个 histo 存储桶的计数应该可以;用 C 和 AVX-512 内在函数更新了我在 How to speed up this histogram of LUT lookups? 上的答案。 godbolt.org/z/EoT6Taz6z
  • 是的,16x(__m512i 中的 int32 元素的数量)对于任何大于链接问答中的 32 个 bin 的东西来说都是多余的。对于这种有 100 个 bin 的情况(来自 rand()%100;,尽管根据输入的长度而不是其值范围分配计数数组),如果使用 AVX-512 聚集,可能更好地使用 __m256i(8x 个元素) /scatter,尽管这会为vpgatherdd / vpscatterdd 牺牲一些每个元素的吞吐量,尤其是在 Ice Lake 上。或者可能仍然进行冲突检测,但仅限于匹配的元素对之间。 (例如 vextract high half / vpcmpeqd)
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 2016-03-20
  • 2016-03-30
  • 2012-02-23
  • 2012-10-09
  • 1970-01-01
  • 2012-03-05
  • 2011-11-04
相关资源
最近更新 更多