이 함수는 매개 변수없이 호출되기 때문에 어떻게 작동하는지 궁금합니다. 실제로 어떤 스레드에서 호출했는지 어떻게 알 수 있습니까?omp_get_thread_num은 어떻게 구현 되었습니까?
답변
는 GNU의의 OpenMP 런타임 라이브러리 libgomp
에 특정하지만, 다른의 OpenMP 런타임은 더 많거나 적게 같은 수행
TLS는 (스레드 로컬 저장소) 방법에 대해 설명합니다 PDF로 문서 링크가 작동합니다. 모든 링크는 GCC 4.8.2 소스 코드의 관련 부분으로 연결됩니다.
는omp_get_thread_num()
의 실제 구현이 매우 간단
int
omp_get_thread_num (void)
{
return gomp_thread()->ts.team_id;
}
각 스레드 struct gomp_thread
인스턴스로 스레드 로컬 포인터를 갖는다. 또한 각 스레드는 스레드 팀의 일부이며 팀 내부의 상태는 유형의 ts
구성원으로 표시됩니다. 후자에는 team_id
이라는 unsigned int
구성원이 포함되어 있으며 팀 구성원의 스레드 ID를 제공합니다.
스레드가 자신의 인스턴스 인 struct gomp_thread
을 찾는 방법은 플랫폼에 TLS (스레드 로컬 저장소)가 있는지 여부에 따라 다릅니다. 후자의 경우, TLS는 POSIX 스레드 라이브러리에 의해 에뮬레이션됩니다. 모두 구현은 다음과 같습니다 TLS와
(here에서 가져온) :
extern __thread struct gomp_thread gomp_tls_data;
static inline struct gomp_thread *gomp_thread (void)
{
return &gomp_tls_data;
}
__thread
키워드는 글로벌 변수 gomp_tls_data
스레드 로컬, 각 스레드는 자체 사본을 얻을 수 있다는 것을 의미한다. TLS없이
:이 케이스에서는 pthread_getspecific()
extern pthread_key_t gomp_tls_key;
static inline struct gomp_thread *gomp_thread (void)
{
return pthread_getspecific (gomp_tls_key);
}
은 (here 위치) 구조 인스턴스의 스레드 로컬 복사본을 획득하는데 사용된다.
pthread_getspecific()
도 값을 저장하는 데 TLS를 사용하고 두 가지 구현이 제공되는 이유가 궁금 할 수도 있지만 PLS에 직접 액세스하는 것이 Pthreads API 함수를 호출하는 것보다 빠를 수 있습니다. 그런 점에서 OS X는 특별한 경우입니다. Mach-O 실행 형식은 GNU 호환 TLS 구현을 제공하지 않으며 일부 사람들은 Pthreads API가 실제로 에뮬레이트 된 GNU TLS보다 빠르다고보고했습니다.
AFAIK, 지정되지 않았으므로 일반적인 대답을 드릴 수 없습니다. GCC는 구조를 사용하여 스레드를 관리합니다.이 스레드에는 __thread
attribute이 있습니다. 나는 다른 컴파일러의 구현이 비슷하다고 생각한다. 다음 무엇 http://www.akkadia.org/drepper/tls.pdf
- 1. 혜성은 어떻게 구현 되었습니까?
- 2. Collection.sort가 어떻게 구현 되었습니까?
- 3. getchar()은 어떻게 구현 되었습니까?
- 4. 파이썬의 fractions.limit_denominator는 어떻게 구현 되었습니까?
- 5. bash에서 어떻게 구현되고 구현 되었습니까?
- 6. std :: has_virtual_destructor는 어떻게 구현 되었습니까?
- 7. SecuROM은 어떻게 물리적으로 구현 되었습니까?
- 8. 파이썬의 difflib.find_longest_match는 어떻게 구현 되었습니까?
- 9. WinAmp와 같은 미디어 라이브러리는 어떻게 구현 되었습니까?
- 10. Java Process.getOutputStream()은 어떻게 구현 되었습니까?
- 11. 스파크 선택 - 폭발 관용구는 어떻게 구현 되었습니까?
- 12. AspectJ cflow pointcut은 어떻게 구현 되었습니까?
- 13. Tie :: IxHash는 Perl로 어떻게 구현 되었습니까?
- 14. "만 센트"는 어떻게 구현 되었습니까?
- 15. 대화 범위가 CDI에서 어떻게 구현 되었습니까?
- 16. Wami 레코더는 실제로 어떻게 구현 되었습니까?
- 17. 리눅스 커널 3.2에서 pthread는 어떻게 구현 되었습니까?
- 18. carmageddon 2의 자동차 물리학은 어떻게 구현 되었습니까?
- 19. Xcode 체계 메뉴/popupButton은 어떻게 구현 되었습니까?
- 20. AudioQueueEnqueueBufferWithParameters가 Monotouch에 구현 되었습니까?
- 21. 어떤 로고가 구현 되었습니까?
- 22. 중단되었거나 계속 구현 되었습니까?
- 23. mysqli가 잘못 구현 되었습니까?
- 24. 왜 'is'가 'as'로 구현 되었습니까?
- 25. EntityFramework 컨텍스트가 잘못 구현 되었습니까?
- 26. Symfony2 ACL이 서비스로 구현 되었습니까?
- 27. $ 슬라이스가 PHP 드라이버에 구현 되었습니까?
- 28. INotifyPropertyChanged 이제 무엇이 구현 되었습니까?
- 29. Rubinius에서 mixins은 어디에 구현 되었습니까?
- 30. AtomicInteger가 JNI 기반으로 구현 되었습니까?
이 분명한 답변을 주셔서 감사합니다. 하지만 아직도 이해할 수없는 것이 있습니다 : omp_get_thread_num은 gomp_thread와 같은 정적 인라인 함수가 아니어야합니까? 그렇지 않다면이 함수는 외부 적으로 링크 될 것이므로 omp_get_thread_num이 컴파일 될 때 gomp_thread는 gomp_thread의 우리 스레드 전용 버전이 아닙니다. (스레드 특정에 따라 gomp_tls_data가 로컬 복사본을 참조하는 확장 된 인라인 함수를 의미합니다). – user3514491
공유 객체는 RTLD에 의해 TLS에 병합 된 전역 데이터 요소를 보유 할 수 있습니다. 세부 사항은 복잡하지만 요약하면 동적 링크 라이브러리 (예 : libgomp.그래서')는 자신의 심볼의 스레드 로컬 버전을 가질 수 있으므로'omp_get_thread_num()'과 같은 일반 (인라인되지 않은) 함수는 호출 스레드의 컨텍스트에서 해당 스레드 로컬 전역 심볼에 액세스 할 수 있습니다. –
고마워, 지금은 정적 링크가 아니라 런타임시 동적 연결 (예 : Windows DLL)이므로 기호가 각 호출에서 변경 될 수 있습니다. – user3514491