gpt4 book ai didi

私有(private)和共享子句的 C++ OpenMP 计算错误

转载 作者:行者123 更新时间:2023-11-30 03:29:16 26 4
gpt4 key购买 nike

我有一个要与 OpenMP 并行化的 for 循环,但存在多个计算错误,可能是由于我对 OpenMP 的多线程概念缺乏理解:

for ( int i = -X/2; i < X/2; ++i )
{
base.y = anchor + i*rho_step;
temp = some_function( base );
if( temp > response )
{
buffer.y = base.y;
response = temp;
}
}

这很好用,然后我做了以下更改:

#pragma omp parallel for shared (buffer, response) private(base, temp)
for ( int i = -X/2; i < X/2; ++i )
{
base.y = anchor + i*rho_step;
temp = some_function( base );
if( temp > response )
{
buffer.y = base.y;
response = temp;
}
}

在这段代码中,buffer.yresponse 都没有正确的值。在我的理解中,每个线程都应该有一个自己的 base.ytemp 拷贝,它们只是用于计算的临时变量,以及 bufferresponse 必须共享(它们将存储计算数据),但这并不像我预期的那样工作。

唯一完美的版本如下,但显然没有性能提升:

omp_lock_t writelock;
omp_init_lock(&writelock);
omp_set_num_threads (4);

#pragma omp parallel for
for ( int i = -X/2; i < X/2; ++i )
{
omp_set_lock(&writelock);
base.y = anchor + i*rho_step;
temp = some_function( base );
if( temp > response )
{
buffer.y = base.y;
response = temp;
}
omp_unset_lock(&writelock);
}
omp_destroy_lock(&writelock);

可能是什么问题? (anchorrho_step 是这个循环中的常量)

最佳答案

为了让您的代码处理 bufferresponse 变量的跨线程,您需要为每个线程使用一些局部变量他们,并与他们进行最终归约以更新他们的共享拷贝。

这是它的样子(未测试):

#pragma omp parallel firstprivate( base )
{
auto localResponse = response;
auto localBuffer = buffer;
#pragma omp for
for ( int i = -X/2; i < X/2; ++i )
{
base.y = anchor + i * rho_step;
auto temp = some_function( base );
if ( temp > localResponse )
{
localBuffer.y = base.y;
localResponse = temp;
}
}
#pragma omp critical
{
if ( localResponse > response )
{
buffer.y = localBuffer.y;
response = localResponse;
}
}
}

关于私有(private)和共享子句的 C++ OpenMP 计算错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45816009/

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