2012-11-03 8 views
14

Tại sao tôi không nhận được các id chuỗi khác nhau khi tôi sử dụng "#pragma omp song song num_threads (4)". Tất cả các id thread là 0 trong trường hợp này. Nhưng khi tôi bình luận dòng và sử dụng số lượng mặc định của chủ đề, tôi đã nhận id thread khác nhau. Lưu ý: - biến tôi đã sử dụng biến tid để lấy id luồng.openMP: tại sao tôi không nhận được id luồng khác nhau khi tôi sử dụng "#pragma omp song song num_threads (4)"

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, char *argv[]) 
{ 
int nthreads, tid; 
int x = 0; 

#pragma omp parallel num_threads(4) 
#pragma omp parallel private(nthreads, tid) 
    { 
    /* Obtain thread number */ 
tid = omp_get_thread_num(); 
    printf("Hello World from thread = %d\n", tid); 

    // /* Only master thread does this */ 
    if (tid == 0) 
    { 
    nthreads = omp_get_num_threads(); 
    printf("Number of threads = %d\n", nthreads); 
    } 

    } 


} 

Sản lượng mã trên: -

Hello World from thread = 0 
Hello World from thread = 0 
Number of threads = 1 
Hello World from thread = 0 
Number of threads = 1 
Hello World from thread = 0 
Number of threads = 1 
Number of threads = 1 

Output khi tôi nhận xét dòng đề cập ở trên: -

Hello World from thread = 3 
Hello World from thread = 0 
Number of threads = 4 
Hello World from thread = 1 
Hello World from thread = 2 
+0

Lưu ý: - cho biên soạn tôi đã làm gcc -fopenmp open.c -o hello –

Trả lời

14

Bạn đang tạo hai khu vực song song lồng nhau. Điều này cũng giống như thực hiện việc này:

#pragma omp parallel num_threads(4) 
{ 
    #pragma omp parallel private(nthreads, tid) 
    { 
    /* Obtain thread number */ 
    tid = omp_get_thread_num(); 
    printf("Hello World from thread = %d\n", tid); 

    // /* Only master thread does this */ 
    if (tid == 0) 
    { 
     nthreads = omp_get_num_threads(); 
     printf("Number of threads = %d\n", nthreads); 
    } 
    } 
} 

omp_get_num_threads() trả về số lượng chủ đề ở trong cùng một khu vực. Vì vậy, bạn đang thực hiện bốn chủ đề, mỗi chủ đề đang thực hiện một chủ đề.

Khu vực song song bên trong chỉ thực hiện một chuỗi vì bạn chưa bật tính song song lồng nhau. Bạn có thể kích hoạt nó bằng cách gọi omp_set_nested(1).

http://docs.oracle.com/cd/E19205-01/819-5270/aewbi/index.html

Nếu thay vì làm hai khu vực song song lồng nhau, bạn muốn tạo ra một khu vực song song đơn và chỉ định hai thuộc tính, bạn có thể làm điều này:

#pragma omp parallel num_threads(4) private(nthreads,tid) 
{ 
    . 
    . 
    . 
} 
+0

Tôi đã thử "#pragma omp_set_nested (1)", nhưng nó không hoạt động. Tôi đang viết nó ngay trên "#pragma omp song song num_threads (4)", nơi tôi sai? –

+1

@jayeshhathila: omp_set_nested() là hàm bình thường –

+0

Tôi cũng có lý do cho tid = 0 Cảm ơn –