2010-01-21 36 views
7

Tôi vừa mới bắt đầu học cách sử dụng OpenMP. Tôi đang cố gắng tìm ra lý do tại sao các mã sau đây không chạy song song với Visual Studio 2008. Nó biên dịch và chạy tốt. Tuy nhiên nó chỉ sử dụng một lõi trên máy lõi tứ của tôi. Đây là một phần của mã mà tôi đang cố gắng chuyển đến hàm mex MATLAB. Bất kỳ con trỏ nào được đánh giá cao.Đang cố gắng biết tại sao mã OpenMP không song song

#pragma omp parallel for default(shared) private(dz, t, v, ts_count) reduction(+: sum_v) 
for(t = 0; t<T; t++) 
{ 
    dz = aRNG->randn(); 
    v += mrdt* (tv - v) + 
     vv_v_sqrt_dt * dz + 
     vv_vv_v_dt*(dz*dz - 1.); 

    sum_v += v; 
    if(t == ts_count-1) 
    { 
     int_v->at_w(k++) = sum_v/(double)(t+1); 
     ts_count += ts; 
    } 
} 

Trả lời

4

Biến v được tính bằng giá trị v của phiên trước

for(t = 0; t<T; t++) { 
    ... 
    v += ... (tv - v) .... 
    ... 
    } 

Bạn không thể làm điều đó, nó phá vỡ sự song. Vòng lặp phải có khả năng chạy trong bất kỳ chuỗi nào, hoặc với các đoạn song song khác nhau cùng một lúc, không có tác dụng phụ. Từ cái nhìn đầu tiên, nó không giống như bạn có thể song song loại vòng lặp này.

+0

Bạn cũng nên cân nhắc kỹ về số máy phát số ngẫu nhiên trong vòng lặp. Tùy thuộc vào việc triển khai, tính năng này có thể khóa trên tài nguyên được chia sẻ, tuần tự hóa mã của bạn một cách hiệu quả sau khi bạn giải quyết vấn đề ở trên. –

0

Tôi không quá chắc chắn, đã lâu rồi kể từ khi tôi sử dụng OpenMP, nhưng bạn có biến vòng lặp được đặt là riêng tư. Đó là điều bạn muốn? Đó không phải là biến song song sao?

0

Một khả năng là bạn đang sử dụng biến "sum_v". Vì bạn đang thực hiện một giảm, thời gian chạy có thể hy vọng sẽ chỉ tích lũy các giá trị trong đó, và truy cập nó 'bình thường' chỉ sau khi vòng lặp được thực hiện.

Các vấn đề liên quan