Bad*_*boy 6 c parallel-processing multithreading task openmp
先决条件:
输入:
代码示例:
(这里conf/config/configData变量仅用于说明目的,主要的兴趣在于value/valueData变量.)
void loopFunc(const char* config, int* value)
{
int conf;
conf = prepare(config); // independent, does not change “config”
*value = process(conf, *value); // dependent, takes prev., produce next
return;
}
int main()
{
int N = 100;
char* configData; // never changes
int valueData = 0; // initial value
…
for (int i = 0; i < N; i++)
{
loopFunc(configData, &valueData);
}
…
}
Run Code Online (Sandbox Code Playgroud)
需要:
已提出并实施的内容:
像这样:
(我提醒说conf/config/configData变量仅用于说明目的,主要的兴趣在于value/valueData变量.)
void loopFunc(const char* config, int* value, volatile int *parSync, int iteration)
{
int conf;
conf = prepare(config); // independent, do not change “config”
while (*parSync != iteration) // wait for previous to be ready
{
#pragma omp taskyield
}
*value = process(conf, *value); // dependent, takes prev., produce next
*parSync = iteration + 1; // inform next about readiness
return;
}
int main()
{
int N = 100;
char* configData; // never changes
int valueData = 0; // initial value
volatile int parallelSync = 0;
…
omp_set_num_threads(5);
#pragma omp parallel
#pragma omp single
for (int i = 0; i < N; i++)
{
#pragma omp task shared(configData, valueData, parallelSync) firstprivate(i)
loopFunc(configData, &valueData, ¶llelSync, i);
}
#pragma omp taskwait
…
}
Run Code Online (Sandbox Code Playgroud)
发生了什么:
它失败.:)
原因是openmp任务占用了openmp线程.例如,如果我们定义5个openmp线程(如上面的代码中所示).
如果在启动的任务中没有i = 0的任务(它不时发生),执行任务会永远等待,永远占用线程,i = 0的任务永远不会启动.
下一步是什么?
我没有其他想法如何实现所需的计算模式.
当前解决方案
感谢下面@parallelgeek的想法
int main()
{
int N = 10;
char* configData; // never changes
int valueData = 0; // initial value
volatile int parallelSync = 0;
int workers;
volatile int workingTasks = 0;
...
omp_set_num_threads(5);
#pragma omp parallel
#pragma omp single
{
workers = omp_get_num_threads()-1; // reserve 1 thread for task generation
for (int i = 0; i < N; i++)
{
while (workingTasks >= workers)
{
#pragma omp taskyield
}
#pragma omp atomic update
workingTasks++;
#pragma omp task shared(configData, valueData, parallelSync, workingTasks) firstprivate(i)
{
loopFunc(configData, &valueData, ¶llelSync, i);
#pragma omp atomic update
workingTasks--;
}
}
#pragma omp taskwait
}
}
Run Code Online (Sandbox Code Playgroud)
true。K == ThreadNum只有在任何正在运行的任务完成后才开始生成后续任务(在生成第一组中的任务之后)。因此,您有一个不变量,即每次只有 K 个任务在 K 个线程上运行和调度。