用于并行区域内部的c openmp并行
我的问题是这样的。但我想做些不同的事情 例如,在我的并行区域内,我希望在4个线程上运行代码。当每个线程进入for循环时,我希望在8个线程上运行代码。差不多用于并行区域内部的c openmp并行,c,multithreading,for-loop,openmp,C,Multithreading,For Loop,Openmp,我的问题是这样的。但我想做些不同的事情 例如,在我的并行区域内,我希望在4个线程上运行代码。当每个线程进入for循环时,我希望在8个线程上运行代码。差不多 #pramga omp parallel num_threads(4) { //do something on 4 threads #pragma omp parallel for num_threads(2) for(int i=0;i<2;i++){ //do something on 8 t
#pramga omp parallel num_threads(4)
{
//do something on 4 threads
#pragma omp parallel for num_threads(2)
for(int i=0;i<2;i++){
//do something on 8 threads in total
}
}
#pramga omp并行num_线程(4)
{
//在4个线程上执行某些操作
#用于num_线程的pragma omp并行(2)
对于(int i=0;i是的,正确的方法是您选择的方法:第二个for循环将由每个4个线程分割,以便8个线程可以同时执行最内部的循环。您在这里拥有的,一个并行部分在另一个并行部分中,大多数支持OpenMP的编译器都支持,但通常由def关闭故障。您需要将OMP\u NESTED
环境变量设置为TRUE
,或者在程序调用OMP\u set\u NESTED(1)
中。请参见,例如
要回答评论中的后续问题,在OpenMP parallel for循环的末尾不需要障碍物;除非使用,否则在for
循环的末尾已经有一个隐式同步障碍物。在for循环中不能有障碍物;如果循环迭代次数没有被th平均分割,会发生什么读取?你会发现一些线程被“卡住”在一个屏障上等待其他线程都无法到达。thx但它似乎不起作用…当我查看cpu的使用情况时,我总是看到其中4个正在运行,但从来没有看到8个…为什么?如果我在8个cpu上并行化外环,所有线程都在运行,但这不是我想要做的…我需要使用4和8(2x4)来区分区域线程…你的计算机上有8个CPU,对吗?你确定8个线程所做的工作足够长,可以显示在监控中吗?我有48个CPU…不是开玩笑…是的,它应该足够长,可以在顶部看到(linux)命令…但我今天下午会更准确地检查它,我会让你知道它不起作用…但我已经得到了答案!参见上面的评论!很好。请他写下他的评论作为答案并接受:)大多数当前启用OpenMP的编译器都支持这里的嵌套并行性(一个并行部分在另一个并行部分中),但默认情况下通常是关闭的。您需要将OMP\u nested
环境变量设置为TRUE
,或者在程序调用OMP\u set\u nested(1)中
。看,例如,是的,很好!thx!@Jonathan Dursi:Vakh要求你重写你的评论作为回答。然后也许你可以提供补充信息。在for循环结束之前,我想同步到线程。但是如果我添加了“屏障”编译器说:障碍区域可能不会紧密嵌套在工作共享、关键、有序、主任务或显式任务区域中。我如何解决这个问题?