2010-01-21 3 views
7

방금 ​​OpenMP을 사용하는 방법을 배우기 시작했습니다. 다음 코드가 Visual Studio 2008과 병렬로 실행되지 않는 이유를 알아 내려고 노력 중입니다. 컴파일되고 정상적으로 실행됩니다. 그러나 그것은 내 쿼드 코어 머신에서 하나의 코어만을 사용합니다. 이것은 MATLAB mex 함수로 이식하려고하는 코드의 일부입니다. 모든 포인터를 주셔서 감사합니다.왜 OpenMP 코드가 병렬 처리되지 않는지 알고 싶습니다.

#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; 
    } 
} 

답변

4

는 V 변수가 이전 반복 당신은 할 수 없습니다

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

의 V 값을 사용하여 계산되며, 이는 병렬 처리를 나누기. 루프는 어떤 순서로든 또는 다른 병렬 덩어리를 동시에 실행할 수 있어야하며 부작용이 없어야합니다. 언뜻보기에, 이런 종류의 루프를 병렬 처리 할 수있는 것처럼 보이지 않습니다.

+0

또한 루프 내에서 임의의 숫자 생성기를 고려해야합니다. 구현에 따라 공유 리소스를 잠글 수 있으므로 위의 문제를 해결 한 후에 코드를 효과적으로 직렬화합니다. –

0

OpenMP를 사용한 이후로 오랜 시간이 걸렸지 만 루프 변수 t는 비공개로 설정되어 있습니다. 너가 원하는게 그거야? 병렬화 변수가 아닌가?

0

하나의 가능성은 "sum_v"변수를 사용하고 있다는 것입니다. 축소 작업을 수행하기 때문에 런타임은 아마 거기에 값을 누적하고 루프가 완료된 후에 만 ​​'정상적으로'액세스 할 것으로 예상합니다.