Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于并行区域内部的c openmp并行_C_Multithreading_For Loop_Openmp - Fatal编程技术网

用于并行区域内部的c openmp并行

用于并行区域内部的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

我的问题是这样的。但我想做些不同的事情

例如,在我的并行区域内,我希望在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 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循环结束之前,我想同步到线程。但是如果我添加了“屏障”编译器说:障碍区域可能不会紧密嵌套在工作共享、关键、有序、主任务或显式任务区域中。我如何解决这个问题?