【发布时间】:2018-01-30 15:27:34
【问题描述】:
我有一个for 循环要与 OpenMP 并行化,但有多个计算错误,可能是由于我对 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.y 和 response 都没有正确的值。据我了解,每个线程都应该有自己的base.y 和temp 副本,它们只是计算的临时变量,buffer 和response 必须共享(它们将存储计算数据),但这并不像我预期的那样工作。
唯一完美的版本是以下,但显然没有性能提升:
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);
可能是什么问题? (anchor 和 rho_step 是这个循环中的常量)
【问题讨论】:
-
对我来说,似乎存在数据依赖关系:
response可能会改变并直接影响以后的循环传递。如果是这样,您将无法使用任何多线程工具轻松加速循环。只有some_function需要很多时间的时候,加多线程才是有用的。 -
response仅在 if 条件为真的情况下发生变化。 some_function 做了很多事情,这就是我试图节省运行时间的原因。感谢您的评论!
标签: c++ multithreading openmp