For循环中的OpenMP并行段(C) – 开销
发布时间:2020-12-16 07:23:45 所属栏目:百科 来源:网络整理
导读:我一直致力于量子模拟.每个时间步骤计算潜在函数,迭代求解器的一个步骤,然后进行一系列测量.这三个过程很容易并行化,我已经确定它们不会相互干扰.此外,还有一些相当简单的东西,但不应该并行完成.设置概要如下所示. omp_set_num_threads(3);#pragma omp paral
我一直致力于量子模拟.每个时间步骤计算潜在函数,迭代求解器的一个步骤,然后进行一系列测量.这三个过程很容易并行化,我已经确定它们不会相互干扰.此外,还有一些相当简单的东西,但不应该并行完成.设置概要如下所示.
omp_set_num_threads(3); #pragma omp parallel { while (notDone) { #pragma omp sections { #pragma omp section { createPotential(); } #pragma omp section { iterateWaveFunction(); } #pragma omp section { takeMeasurements(); } } #pragma omp single { doSimpleThings(); } } } 代码工作得很好!我看到速度增加,主要与TDSE求解器一起运行的测量值相关(速度增加约30%).但是,程序从使用大约10%的CPU(大约一个线程)到35%(大约三个线程).如果潜在的函数,TDSE迭代器和测量结果同样长,这是有意义的,但它们没有.根据速度的提高,我预计会有大约15%的CPU使用率. 我有一种感觉这与在while循环中运行这三个线程的开销有关.更换 #pragma omp sections 同 #pragma omp parallel sections (并且在循环之前省略两行)不会改变任何东西.有更有效的方法来运行此设置吗?我不确定线程??是否经常被重新创建,或者线程是否在等待其他线程完成时占用整个核心.如果我将线程数从3增加到任何其他数字,程序将使用所需的资源(可能是所有CPU)并且不会获得性能提升. 解决方法
我尝试了很多选项,包括使用任务而不是部分(具有相同的结果),切换编译器等.正如Qubit所建议的,我也尝试使用std :: async.这是解决方案! CPU使用率从大约50%下降到30%(这与原始帖子在不同的计算机上,因此数字不同 – 基本上1.6x CPU使用率的性能提升为1.5倍).这更接近我对这台电脑的预期.
作为参考,这是新的代码大纲: void SimulationManager::runParallel(){ auto rV = &SimulationManager::createPotential(); auto rS = &SimulationManager::iterateWaveFunction(); auto rM = &SimulationManager::takeMeasurements(); std::future<int> f1,f2,f3; while(notDone){ f1 = std::async(rV,this); f2 = std::async(rS,this); f3 = std::async(rM,this); f1.get(); f2.get(); f3.get(); doSimpleThings(); } } 使用std :: async调用三个原始函数,然后使用未来变量f1,f2和f3将所有内容收集回单个线程并避免访问问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |