2013-05-21 27 views
8

Tôi đã viết một mẫu mã bên dưới:Xác định các biến toàn cục trong mpi

#include <stdio.h> 
#include <mpi.h> 

double x; 

int main (int argc, char **argv) { 
    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 

    if (rank==0) x=10.1; 

    MPI_Barrier(MPI_COMM_WORLD); 
    printf("%f\n", x); 

    MPI_Finalize(); 
    return 0; 
} 

Như người ta có thể nhận thấy, chương trình này thực sự xác định một biến toàn cầu gọi là x và các chủ đề 0 cố gắng gán một số giá trị cho nó. Khi tôi có chương trình này chạy trên một (Symmetric multiprocessing) Máy SMP với 4 lõi tôi nhận được kết quả như sau:

10.1 
0 
0 
0 

Nhiều thú vị, khi tôi thay đổi mã của tôi để mỗi chủ đề in địa chỉ của biến x, tức là & x, tất cả đều in cùng một thứ.

Câu hỏi của tôi là làm thế nào có thể một số chuỗi trên hệ thống SMP có cùng giá trị cho địa chỉ của biến trong khi chúng không chia sẻ cùng một giá trị?

và câu hỏi thứ hai của tôi là cách tôi nên thay đổi mã ở trên để tôi nhận được các kết quả sau đây?

10.1 
10.1 
10.1 
10.1 
+2

Biến có thể có cùng địa chỉ và giá trị khác vì nó không thực sự là chủ đề mà là các quy trình? –

+0

@Joachim: Làm thế nào tôi có thể tìm hiểu xem chúng là các quá trình hoặc chủ đề? – Mehrdad

+1

Với việc triển khai MPI hiện tại, mỗi cấp bậc là một quá trình riêng biệt. –

Trả lời

5

Bạn có thể sử dụng phát sóng:

MPI_Bcast(&x,1,MPI_DOUBLE,0,MPI_COMM_WORLD); 

chí này đã gửi các giá trị của x vào quá trình từ 0 đến tất cả các quá trình khác.

+1

0 trong cuộc gọi hàm trên là thứ hạng của quá trình khởi tạo chương trình phát sóng. Như bạn đã nói đó là quá trình gốc của bạn làm thay đổi giá trị của x, đó là lý do tại sao tham số này là 0. Lưu ý rằng MPI_Bcast là một thường trình chặn. Mọi tiến trình trong bộ giao tiếp (MPI_COMM_WORLD trong trường hợp này) cần gọi MPI_BCast() trước khi bất kỳ chức năng nào có thể tiếp tục. – Madsen