如何在OpenMP

时间:2017-11-16 04:05:42

标签: c parallel-processing dependencies openmp

我正在编写一个代码,用于使用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依赖子句。请告诉我这个问题。

0 个答案:

没有答案