我有一个并行代码,这是纯粹的MPI。MPI在8个核心内可很好地扩展。然而,由于内存要求,我将不得不使用混合代码。我的代码结构如下
for( A Sequential loop for 10e5 iterations)
{
highly_parallelizable_function_call_1()
some_sequential_work
highly_parallelizable_function_call_2()
some_sequential_work
MPI_send()
MPI_recv()
highly_parallelizable_function_call_3()
highly_parallelizable_function_call_4()
}函数3和4大约占了90%的时间。我将函数3和4更改为openmp并行代码。分析显示,我在这方面的速度只有4-5。因此,此代码可能无法像单独的MPI代码那样具有良好的伸缩性。我怀疑这可能是由于线程开销造成的。为了避免这个问题,我想把这段代码改为只在开头创建线程,如下所示
#pragma omp parallel
for( A Sequential loop for 10e5 iterations)
{
parallel_version_function_call_1()
if( thread_id==0) some_sequential_work
parallel_version_function_call_2()
if( thread_id==0) some_sequential_work
if( thread_id==0) MPI_send()
if( thread_id==0) MPI_recv()
parallel_version_function_call_3()
parallel_version_function_call_4()
}做这样的事情会有好处吗?
发布于 2013-08-19 09:50:30
我认为您当前的实现没有注意到Amdahl定律(如果您愿意,可以在google上搜索它)。假设你只对90%的代码进行了并行化,你可以要求的最好的加速比(假设有8个内核)是:
Speedup = 1.0 / (p_{seq} + (1 - p_{parallel}) / #cores)在你的例子中是:
Speedup = 1.0 / ( 0.1 + 0.9 / 8) = 4.71因此,您当前的openmp并行化正在执行预期的操作。Long answer short:是的,如果这意味着函数1和2也将被并行化,那么后面的实现应该会给你带来更好的加速比。
https://stackoverflow.com/questions/18215823
复制相似问题