gpt4 book ai didi

c - OpenMP 中每个线程的私有(private) 'for' 循环

转载 作者:太空宇宙 更新时间:2023-11-04 01:07:29 25 4
gpt4 key购买 nike

请参阅下面的编辑以获得我的初步解决方案

考虑以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

int main(void) {

int counter = 0;
int i;

omp_set_num_threads(8);

#pragma omp parallel
{
int id = omp_get_thread_num();
#pragma omp for private(i)
for (i = 0; i<10; i++) {
printf("id: %d thread: %d\n", i, id);
#pragma omp critical // or atomic
counter++;
}
}

printf("counter %d\n", counter);

return 0;
}

我将线程数定义为 8。对于 8 个线程中的每一个,我想为每个单独的线程创建一个 for 循环,以增加变量 counter .但是,OpenMP 似乎并行化了 for 循环:

i: 0 thread: 0
i: 1 thread: 0
i: 4 thread: 2
i: 6 thread: 4
i: 2 thread: 1
i: 3 thread: 1
i: 7 thread: 5
i: 8 thread: 6
i: 5 thread: 3
i: 9 thread: 7
counter 10

因此,counter=10,但我想要 counter=80。我该怎么做才能让每个线程都执行自己的 for 循环,同时所有线程都递增 counter

以下代码给出了预期的结果:我添加了另一个外部 for 循环,它从 0 循环到最大线程数。在这个循环中,我可以为每个线程声明我的 for 循环私有(private)。事实上,在这种情况下,counter=80这是这个问题的最佳解决方案还是有更好的解决方案?

int main(void) {


omp_set_num_threads(8);

int mthreads = omp_get_max_threads();

#pragma omp parallel for private(i)
for (n=0; n<mthreads; n++) {
int id = omp_get_thread_num();
for (i = 0; i<10; i++) {
printf("i: %d thread: %d\n", i, id);
#pragma omp critical
counter++;
}
}

}
printf("counter %d\n", counter);

return 0;
}

最佳答案

解决方案非常简单 - 删除工作共享构造 for:

#pragma omp parallel
{
int id = omp_get_thread_num();
for (int i = 0; i<10; i++) {
printf("id: %d thread: %d\n", i, id);
#pragma omp critical // or atomic
counter++;
}
}

for 的控制部分内声明 i 是 C99 的一部分,可能需要您向编译器传递一个类似于 -std=c99< 的选项。否则,您可以简单地在 block 的开头声明 i 。或者您可以在区域外声明它并使其成为private:

int i;

#pragma omp parallel private(i)
{
int id = omp_get_thread_num();
for (i = 0; i<10; i++) {
printf("id: %d thread: %d\n", i, id);
#pragma omp critical // or atomic
counter++;
}
}

由于您没有在并行区域内使用 counter 的值,因此您也可以改用总和缩减:

#pragma omp parallel reduction(+:counter)
{
int id = omp_get_thread_num();
for (int i = 0; i<10; i++) {
printf("id: %d thread: %d\n", i, id);
counter++;
}
}

关于c - OpenMP 中每个线程的私有(private) 'for' 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19746866/

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