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
Multithreading OpenMP嵌套任务,1个线程不执行任务_Multithreading_Openmp_Gcc4.8 - Fatal编程技术网

Multithreading OpenMP嵌套任务,1个线程不执行任务

Multithreading OpenMP嵌套任务,1个线程不执行任务,multithreading,openmp,gcc4.8,Multithreading,Openmp,Gcc4.8,我正在用下面编写的简单代码进行一些测试。 问题是,在一台四核机器中,我只得到75%的负载。第四个核心是空转,什么也不做。代码有一个omp并行程序,然后是一个omp单线程,线程在其中生成一个任务。该任务会生成许多子任务。任务将在屏障中等待,直到其所有子线程(单个区域中线程的孙子)完成,执行单个区域的线程将在另一个屏障上等待,直到其直系子任务完成。问题是执行单个区域的线程不执行任何子任务。考虑到我使用的块大小,我创建了数千个任务,因此这不是可用并行性的问题 我是否误解了OpenMP任务?它是否与ta

我正在用下面编写的简单代码进行一些测试。 问题是,在一台四核机器中,我只得到75%的负载。第四个核心是空转,什么也不做。代码有一个omp并行程序,然后是一个omp单线程,线程在其中生成一个任务。该任务会生成许多子任务。任务将在屏障中等待,直到其所有子线程(单个区域中线程的孙子)完成,执行单个区域的线程将在另一个屏障上等待,直到其直系子任务完成。问题是执行单个区域的线程不执行任何子任务。考虑到我使用的块大小,我创建了数千个任务,因此这不是可用并行性的问题

我是否误解了OpenMP任务?它是否与taskwait仅等待直接子级相关?如果是这样,我如何让空闲线程执行可用的工作?假设我想像OpenMP 4.0那样创建具有依赖关系的任务,那么我将无法利用具有依赖关系的所有可用线程。父任务中的屏障是必需的,因为我不想释放依赖于它的下一个任务,直到它的所有子任务都完成

#include <iostream>
#include <cstdlib>

#include <omp.h>

using namespace std;

#define VECSIZE 200000000

float* A;
float* B;
float* C;

void LoopDo(int start, int end) {
    for (int i = start; i < end; i++)
    {
        C[i] += A[i]*B[i];
        A[i] *= (B[i]+C[i]);
        B[i] = C[i] + A[i];
        C[i] *= (A[i]*C[i]);
        C[i] += A[i]*B[i];
        C[i] += A[i]*B[i];
        ....
    }


void StartTasks(int bsize)
{
    int nthreads = omp_get_num_threads();
    cout << "bsize is: " << bsize << endl;
    cout << "nthreads is: " << nthreads << endl;
    #pragma omp task default(shared)
    {
        for (int i =0; i <VECSIZE; i+=bsize)
        {
            #pragma omp task default(shared) firstprivate(i,bsize)
            LoopDo(i,i+bsize);
            if (i + bsize >= VECSIZE) bsize = VECSIZE - i;
        }
        cerr << "Task creation ended" << cerr;
        #pragma omp taskwait
    }
    #pragma omp taskwait
}


int main(int argc, char** argv)
{
    A = (float*)malloc(VECSIZE*sizeof(float));
    B = (float*)malloc(VECSIZE*sizeof(float));
    C = (float*)malloc(VECSIZE*sizeof(float));
    int bsize = atoi(argv[1]);
    for (int i = 0; i < VECSIZE; i++)
    {
        A[i] = i; B[i] = i; C[i] = i;
    }
    #pragma omp parallel
    {
        #pragma omp single
        {
            StartTasks(bsize);
        } 
    }
    free(A);
    free(B);
    free(C);
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
#定义大小200000000
浮动*A;
浮动*B;
浮点数*C;
void LoopDo(int开始,int结束){
for(int i=start;i我不能确定这是否相关,但嵌套并行是通过
omp\u set\u nested
omp\u nested
?使用omp\u nested启用的。虽然在这种情况下不需要嵌套并行。嵌套并行仅用于嵌套并行区域,而不是任务。
 for (int i = 0; i<nthreads;i++)
 {
    #pragma omp task default(shared)
    {
        for (int i =0; i <VECSIZE; i+=bsize)
        {
            #pragma omp task default(shared) firstprivate(i,bsize)
            LoopDo(i,i+bsize);
            if (i + bsize >= VECSIZE) bsize = VECSIZE - i;
        }
        cerr << "Task creation ended" << cerr;
        #pragma omp taskwait
    }
  }
  #pragma omp taskwait