2012-01-25 2 views

답변

2

OpenMP 사양에서는 변수가 스택이나 힙에 할당되는지 여부를 지정하지 않습니다 (공유 배열에있는 경우 힙에 있거나 각 스레드에 하나의 개체가 할당 된 경우)). 일반적으로 개인 변수는 스택에 할당된다고 가정합니다 (그렇게하지 않는 이유도없고 일반적으로 더 효율적입니다). the manual에 따르면 libgomp (gcc에서 사용되는 구현)에서 사용되는 동작은 적어도 다른 구현에 대한 단서는 없습니다. (비록 내가 같은 것을하지 않아야하는 작은 이유가 있지만).

+0

의미가 있습니다. 그것이 내가 생각했을 것입니다. 감사. –

0

OpenMP는 개인 변수 할당에 대해 아무것도 지정하지 않습니다.
두 가지 옵션이 있습니다 : 힙과 스택.
각 스레드가 명령 수를 줄이는 것을 생각하면 마스터 스레드가 아래와 같은 개인 변수를 할당하는 것이 합리적입니다.

번호 :

1: set_threads(n) 
2: #pragma omp parallel private(var) 
3: { 
4: var = ... 
5:} 

머신 코드 :
호선 : var_ptr 새로운 변수 = [N]
라인 4 : var_ptr [get_thread_id()] = ...

그러나 위의 코드는 서로 다른 스레드에서 사적인 변수들 사이에 많은 거짓 공유를 유도합니다. 그래서 나는 컴파일러가 각 쓰레드의 스택에 그것을 할당하는 것이 합리적이라고 생각한다.

+0

참고 자료가 있으십니까? 명세는이를 명시하는 것처럼 보이지 않으며 단순히 스택에 할당하는 것보다 비효율적 인 것처럼 보인다. 또한 [this] (http://gcc.gnu.org/onlinedocs/libgomp.pdf)에 따르면 적어도 libgomp는 그렇게하지 않습니다. 'private' 데이터의 할당을 피하기 위해 어떤 지시어가 있는지 외에, 적어도 어떤 것도없는 것 같습니다. – Grizzly

+0

Shared! = private이고 여러분이 보여준 의사 코드는이 코드가 대부분의 (캐시 일관된) CPU 아키텍처에서 주요 성능 저하 요인 인 잘못된 공유를 유발하기 때문에 확실히 완전히 잘못되었습니다. –

+0

@above .. 오 그래, 젠장 .. 너의 요점이있어. 문제는 내가 실행 된 명령어의 수를 최소화한다는 개발자의 관점에서 생각하고 있었다는 것입니다. 힙에 전용 변수를 할당하면 전용 변수를 수용하기 위해 모든 스레드가 스택 포인터를 감소시키는 것에 비해 마스터 스레드 만 malloc을 수행합니다. 그러나 이것은 장기적으로 사적 변인들간에 잘못된 공유를 유도 할 것이다. 그것을 지적 주셔서 감사합니다. 추신 : 편집 된 게시물을 참조하십시오. –