gpt4 book ai didi

c - 避免线程创建 openMP 的开销

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

所以在我的代码中有各种函数可以改变各种数组,调用函数的顺序很重要。由于所有函数都被多次调用,因此创建和销毁线程已成为一项巨大的开销。编辑我的问题,因为我可能过于简化了我当前的问题。一个例子

double ans = 0;
for (int i = 0; i < 4000; i++){
funcA(a,b,c);
funcB(a,b,c);
ans = funcC(a,b,c):
}
prinft(ans);

funcA、funcB 和 func C 在哪里

void funcA (int* a, point b, int* c){
#pragma omp parallel for shared(a,b,c)
for (int ii = 0; ii < b.y; ii++){
for (int jj = 0; jj < b.x; jj++){
\\ alter values of a and c
}
}
}

void funcB (int* a, point b, int* c){
#pragma omp parallel for shared(a,b,c)
for (int ii = 0; ii < b.y; ii++){
for (int jj = 0; jj < b.x; jj++){
\\ alter values of a and c
}
}
}

double funcC (int* a, pointb, int* c){
double k = 0;
#pragma omp parallel for shared(a,b,c) reduction(+:k)
for (int ii = 0; ii < b.y; ii++){
for (int jj = 0; jj < b.x; jj++){
\\ alter values of a and c
k += sqrt(a[ii*jj] + c[ii**jj]);
}
}
return k;
}

有没有什么方法可以在初始 for 循环之前创建一组线程,这些线程被所有函数使用并且不会不断地被销毁和再次创建,并且仍然保持函数调用中的正确顺序?

编辑 2:

我正在寻找一种按顺序运行 funcA、funB、funcC 的方法。但是这些函数内部有一些代码会使用多个线程。我想要一种在开始时创建线程的方法,然后它们将仅用于那些并行部分,因此最后的答案是正确的。有没有办法避免40000次fork和join?

最佳答案

假设你的其余代码是正确的,下面的代码应该按照你想要的方式工作:

#pragma omp parallel shared( a, b, c )
for (int i = 0; i < 4000; i++){
funcA(a,b,c);
funcB(a,b,c);
funcC(a,b,c):
}

现在定义的不同函数如下:

void funcA( int* a, point b, int* c ) {
#pragma omp for schedule( static )
for (int ii = 0; ii < b.y; ii++) {
for (int jj = 0; jj < b.x; jj++) {
\\ alter values of a and c
}
}
}

void funcB( int* a, point b, int* c ) {
#pragma omp for schedule( static )
for (int ii = 0; ii < b.y; ii++) {
for (int jj = 0; jj < b.x; jj++) {
\\ alter values of a and c
}
}
}

void funcC( int* a, point b, int* c ) {
#pragma omp for schedule( static )
for (int ii = 0; ii < b.y; ii++) {
for (int jj = 0; jj < b.x; jj++) {
\\ alter values of a and c
}
}
}

函数内的这些 OpenMP 指令称为孤立指令,因为它们出现在任何 OpenMP 并行区域之外的代码中。但是,在运行时,任何预先存在的 OpenMP 线程组都会按照您希望的方式使用它们。

此外,我还在每个循环中添加了一个 schedule( static ) 子句。这对于代码正确性来说不是必需的,但是这可以通过确保每个线程始终处理跨函数和调用的相同索引来提高性能...

关于c - 避免线程创建 openMP 的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40248584/

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