gpt4 book ai didi

c - for 循环上的多个 pragma 指令(C 和 VS 2013)

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:03 26 4
gpt4 key购买 nike

我正在尝试使用 OpenMP 将 for 循环计算拆分为多个线程。此外,我试图指示编译器对分配给每个线程的每个 block 进行矢量化。代码如下:

#pragma omp for private(i)
__pragma(loop(ivdep))
for (i = 0; i < 4096; i++)
vC[i] = vA[i] + SCALAR * vB[i];

问题是两个 pragma 都期望 for 循环紧随其后。

是否有任何智能构造可以使这项工作正常进行?

有些人可能会争辩说,由于 OpenMP 的 for 循环拆分,循环的矢量化将不起作用。但是我读到,#pragma omp for 将循环分成许多与线程数相等的连续 block 。 是thitt吗?

最佳答案

如何使用 #pragma omp for simd private(i) 而不是 pragma + __pragma() ?

编辑:由于 OpenMP 4 似乎不适合您,您可以手动拆分循环以摆脱 #pragma omp for,方法是手动计算索引限制omp_get_num_threads()omp_get_thread_num(),然后保留每个线程循环的 ivdep

编辑 2:因为我是一个好人,而且这是样板文件(在 MPI 中编程时更常见,但仍然如此)但是当你第一次做的时候就很烦人,这是一个可能的解决方案:

#pragma omp parallel
{
int n = 4096;
int tid = omp_get_thread_num();
int nth = omp_get_num_threads();
int chunk = n / nth;
int beg = tid * chunk + min( tid, n % nth );
int end = ( tid + 1 ) * chunk + min( tid + 1, n % nth );
#pragma ivdep
for ( int i = beg; i < end; i++ ) {
vC[i] = vA[i] + SCALAR * vB[i];
}
}

关于c - for 循环上的多个 pragma 指令(C 和 VS 2013),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32524376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com