我正在编写一个代码,用于使用OpenMP测试任务依赖的工作流程序列。
我有4种任务类型。
Task 1
有1项任务,
Task 2
和 Task 3
分别有5个任务(i = 0,2,4,6,8)和< / p>
Task 4
有1项任务。
他们正在并行工作,但问题是序列不是我所期望的。
我想要的是:
Task 1:
应该对 Task 2
的第一项任务有任务依赖性。
Task 2:
所有5个任务应分别依赖于 Task 3
所有5个任务。
Task 3:
第3和第4项任务应依赖 Task 4
。
这是我的代码:
#include <stdio.h>
#include <omp.h>
#include <unistd.h>
int main(){
int x,y;
int i,j;
int a[10];
for(x=0; x<10; x++){
a[x] = x+1;
}
omp_set_num_threads(10);
printf("number of thread = %d\n", omp_get_num_threads());
#pragma omp parallel
{
#pragma omp master
{
#pragma omp task depend (out:a[0:2])
{
sleep(2);
a[0] = 1; // work only parameter is a[0]
printf("1\n");
}
}
#pragma omp for
for(i=0; i<10; i+=2){
#pragma omp task depend(in:a[i:2]) depend(out:a[i:2])
{
sleep(2);
a[i] = a[0];
a[i+1] = a[1];
printf("2 :: i = %d\n", i);
}
}
#pragma omp for
for(j=0; j<10; j+=2){
#pragma omp task depend(in:a[j:2]) depend(out:a[j:2])
{
sleep(2);
a[j] = a[j]*2;
a[j+1] = a[j+1]*2;
printf("3 :: j = %d\n", j);
}
}
#pragma omp master
#pragma omp task depend (in:a[6:4])
{
sleep(2);
for(x=0; x<10; x++){
printf("%d, ", a[x]);
}
printf("end\n");
}
}
return 0;
}
简而言之,他们看起来像这样:
任务清单:
任务1:设置[0]
任务2-0,2-2,2-4,2-6,2-8:将[0],[1]复制到[i],[i + 1] < / p>
任务3-0,3-2,3-4,3-6,3-8:将[i],[i + 1]设为双倍值
任务4:打印[0:10]
依赖关系:
任务1 - &gt;任务2-0 - &gt;任务3-0
任务2-2 - &gt;任务3-2
任务2-4 - &gt;任务3-4
任务2-6 - &gt;任务3-6 - &gt;任务4
任务2-8 - &gt;任务3-8 - &gt;任务4
所以,我希望流程是这样的:
Step 1 : Task 1 / Task 2-2 / Task 2-4 / Task 2-6 / Task 2-8
(sleep) ↓ ↓ ↓ ↓ ↓
Step 2 : Task2-0 / Task 3-2 / Task 3-4 / Task 3-6 / Task 3-8
(sleep) ↓ ↓ ↓
Step 3 : Task3-0 Task 4
输出:1,2,2,4,2,4,2,4,2,4结束
但是,现在我得到了这个输出:
Step 1 : Task 1 / Task 2-2 / Task 2-4 / Task 2-6 / Task 2-8
(sleep) ↓ ↓ ↓ ↓ ↓
Step 2 : Task2-0 ↓ ↓ ↓ ↓
(sleep) ↓ ↓ ↓ ↓ ↓
Step 3 : Task3-0 / Task 3-2 / Task 3-4 / Task 3-6 / Task 3-8
(sleep) ↓ ↓
Step 4 : Task4
输出:2,4,2,4,2,4,2,4,2,4,结束
1)如何制作正确的依赖序列?
2)通过在互联网上进行一些搜索,我猜内部数组中的depend子句应该像array[start:size]
一样,但我不确定如何在代码中写入? < / p>
我不熟悉OpenMP依赖子句。请告诉我这个问题。