gpt4 book ai didi

openmp - 使用 openmp 并行执行函数

转载 作者:行者123 更新时间:2023-12-01 15:30:48 29 4
gpt4 key购买 nike

我有一系列对几个独立函数的调用。

func1(arg);
func2(arg);
func3(arg);

我想并行执行它们,而不是串行执行它们。我目前正在使用
#pragma omp parallel
{
func1(arg);
func2(arg);
func3(arg)
}

我正在尝试的其他方法是使用 switch case,然后并行执行它以将任务拆分为不同的线程,例如
function(arg, value)
{
switch(value)
{
case 1: // code of func1
case 2: // code of func2
case 3 :// code of func3
}
}

#pragma omp parallel for
for(j=0; j<3; j++)
function(arg, j);

我的问题是这些方法中的任何一个都不比对函数的顺序调用更好。
如何并行化对这些函数的调用。

谢谢,K

最佳答案

您正在寻找 OpenMP tasks ,在 OpenMP 3 中添加:

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

void func1(int arg) {
int tid = omp_get_thread_num();
printf("Thread %d in func1: got arg %d\n", tid, arg);
}

void func2(int arg) {
int tid = omp_get_thread_num();
printf("Thread %d in func2: got arg %d\n", tid, arg);
}

void func3(int arg) {
int tid = omp_get_thread_num();
printf("Thread %d in func3: got arg %d\n", tid, arg);
}

int main(int argc, char **argv) {
int arg=173;
#pragma omp parallel default(none) shared(arg)
#pragma omp single
{
#pragma omp task
func1(arg);

#pragma omp task
func2(arg);

#pragma omp task
func3(arg);

#pragma omp taskwait
/* if you have something that needs all the results above
* but needs to be in the parallel reason it would go here;
* otherwise the task wait is not needed */
}

return 0;
}

运行给出:
$ export OMP_NUM_THREADS=3
$ ./tasks
Thread 1 in func3: got arg 173
Thread 0 in func2: got arg 173
Thread 2 in func1: got arg 173

如果由于某种原因(Visual Studio)您无法使用 OpenMP 2,您可以使用部分,这些部分不太灵活但在这里工作正常:
int  main(int argc, char **argv) {
int arg=173;
#pragma omp parallel sections default(none) shared(arg)
{
func1(arg);

#pragma omp section
func2(arg);

#pragma omp section
func3(arg);
}

return 0;
}

关于openmp - 使用 openmp 并行执行函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25431821/

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