2014-01-13 3 views
2

openMP로 프로젝트를 계산하고 있습니다. 이 프로젝트 내가 특히, 계산을 수행해야 DEFAULT_HEIGHT는 상수이다 nthreads모든 스레드에서 볼 수있는 변수의 단일 계산

gap = (DEFAULT_HEIGHT/nthreads); 

내 병렬 영역 내부 스레드의 수이다. 내 문제는 내가 내부 nthreads 알고 있어야하기 때문에 변수 gap 병렬 영역 외부에서 계산할 수 없다는 것입니다. 그러나 다른 한편으로는 모든 스레드에 대해 gap을 계산하고 싶지 않습니다. 또한 나는이 같은 코드를 설정할 수 없습니다 :

if(tid==0){ 
    gap = (DEFAULT_HEIGHT/nthreads); 
} 

내가 모든 스레드의 esecution의 순서를 모르기 때문에를, 그래서 될 수있는 필요가 마지막으로 내 모든 다른 계산을위한 스레드 0 시작 gap은 잘못 설정됩니다 (설정되지 않기 때문에). 따라서이 문제없이이 계산을 한 번만 수행하는 방법이 있습니까?

감사

답변

6

single 지시어로 묶인 코드를 실행, 다른 스레드를

#pragma omp single 
{ 
    gap = (DEFAULT_HEIGHT/nthreads); 
} 

하나 개의 스레드 같은 것을 공유 변수입니다 gap을 확인하고 OpenMP를 single 지시로 묶 닫힌 코드 블록의 끝에서 기다릴 것입니다.

gap을 비공개로 설정하고 모든 스레드가 자신의 값을 계산하도록 할 수도 있습니다. 이것은 더 빠를 수 있으며, single 옵션에는 항상 동기화가 필요하며 항상 시간이 걸립니다. 관심이 있다면 결과를 비교하고 비교하십시오. (나는 이것이 ComicSansMS가 제안하는 것이라고 생각한다.)

+0

그래, 나는 ComicsSansMS의 답변에 대해 같은 생각을한다. 그러나 간격을 공유하고 모든 스레드에 대한 계산을 수행해도 계산 시간이 변경되지는 않습니다. 그러나 나는 내가 당신에게 나의 대답을 줄 결과를 비교하자마자 이것을 시도하고있다. 모든 경우에있어서 –

+0

@Smat에 감사드립니다. 'single' 구조체에 의해 도입 된 오버 헤드가 코드 성능에 중요한 영향을 미치는 경우, 처음에는 OpenMP 병렬화를위한 좋은 후보가 아닙니다. –

+0

여기에서 싱글을 사용하는 것이 필요하거나 도움이됩니까? 경쟁 조건이지만 모든 쓰레드는 같은 값을 쓸 것입니다. 나는 그것들이 동기화를 요구하고 단일을 기다리는 것보다 느리다는 것을 의심한다. 가장 좋은 점은 단지 '갭'을 비공개로 설정하고 각 트레드에서 동일한 값을 계산하는 것입니다. –

3

단점은 하나의 스레드 만 계산을 수행하면 그 값에 대한 액세스를 동기화해야한다는 것이다. 특히 값을 읽기만 원하는 스레드는 동기화가 필요합니다. 보통 쓰기가 이미 완료되었는지 여부를 결정하는 다른 방법이 없습니다. 변수의 초기화가 너무 비싸서이를 보상 할 수 있다면 변수를 가져와야합니다. 하지만 아마 그렇지는 않습니다.

메모리에서 데이터를 가져 오는 데 걸린 시간에 CPU에서 많은 계산을 수행 할 수 있습니다. 이 액세스를 올바르게 동기화하면 추가주기가 줄어들어 바람직하지 않은 정지 효과가 발생할 수 있습니다. 더 나쁜 경우, 그러한 영향의 영향은 대개 자원을 공유하는 스레드의 수와 함께 크게 증가합니다.

동기화 오버 헤드가 중복 데이터에 대한 계산 시간 절약으로 인한 이점을 쉽게 무효화하므로 병렬 계산에서 일부 중복성을 수용하는 것이 일반적입니다.

+0

이 설명에 감사드립니다. 내 프로그램의 공연은 그 목표를 위해 고려해야 할 사항입니다. 그래서 고성능 마크 솔루션을 시도 할 것이고, 나중에 또는 그렇지 않은 경우 컴퓨팅 시간에 더 나은 것을 비교하려고 할 것입니다. –

관련 문제