2016-10-06 3 views
0

Учитывая следующий пример, OpenMP требует определения адресов, хранящихся в buff1 и buff210. Однако адреса, хранящиеся в buff1 и buff2, определяются в соответствии с идентификатором (myid) потока, который выполняет задачу. Как я могу решить свою проблему? Любое решение оценивается. Мне не разрешено выделять память.Зависимости задач OpenMP от поточно-частных хранилищ

mystruct* buff1; 
mystruct* buff2; 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0]) 
{ 
    int myid=omp_get_thread_num(); 
    buff1=buffers[myid]; 
    processA(data, buff1); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2[0:0]) 
{ 
    int myid=omp_get_thread_num(); 
    buff2=buffers[myid]; 
    processB(data, buff2); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0]) depend(inout: buff2[0:0]) 
{ 
    processC(data, buff1, buff2); 
} 

ответ

0

Задания задачи регистрируются при создании задач. Обратите внимание, что они должны быть выполнены до начала выполнения задачи, поэтому то, что вы просите, невозможно.

Вы считали, что определить зависимости от buff1 и buff2 напрямую, а не по содержанию, на которое они указывают?

mystruct* buff1; 
mystruct* buff2; 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1) shared(buff1) 
{ 
    int myid=omp_get_thread_num(); 
    buff1=buffers[myid]; 
    processA(data, buff1); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2) shared(buff2) 
{ 
    int myid=omp_get_thread_num(); 
    buff2=buffers[myid]; 
    processB(data, buff2); 
} 
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1, buff2) // shared(buff1, buff2) ??? 
{ 
    processC(data, buff1, buff2); 
} 

Важно отметить разницу значений этих двух положений: depend(inout: buff1) и depend(inout: buff1[0:0]). Первая определяет зависимость от &buff1, тогда как вторая определяет зависимость от &buff1[0] = &(*(buff1 + 0)) = buff1. В общем, первый используется, когда задача производит значение самого указателя (и обычно используется вместе с предложением shared), тогда как вторая используется, когда задача изменяет данные, указанные этим указателем.

И, наконец, вы не указали данные об buff1 и buff2 переменных. Если изменения, которые ваши задачи выполняют с этими переменными, должны быть видны извне, вы должны аннотировать эти переменные как общие.

Смежные вопросы