2014-07-23 4 views
0

현재 OpenMp를 사용하는 전직 동료가 작성한 코드를 작성하고 있습니다. 그러나 OpenMp에 대한 경험은 없으며 코드를 읽음으로써 기본 지식을 이해하는 동안 Im은 현재 내 수정을 위해 스레드 로컬 멤버를 선언하는 방법을 알아 냈습니다.OpenMp : Threadlocal member

매우 단순화 된 버전의 현재 코드는 다음과 같습니다

struct Worker 
{ 
    void work() { //... } 
}; 

------------------------------------------------------------------- 

Worker worker; 

#pragma omp parallel for 
for (int i = 0; i < n; ++i) 
{ 
    worker.work(); 
} 

내가 acheive 할 것은 이와 비슷한 방식으로 Worker 클래스를 수정하는 것입니다 :

struct Worker 
{ 
    void work() { // m_var is accessed here } 

    int m_var; // should be threadlocal 
}; 

그러나 I OpenMP를 사용하여이를 달성하는 방법을 알지 못합니다. Worker 안에있는 다른 모든 멤버는 동기화되거나 스레드 로컬되지 않아야합니다.

추신 : 호기심 많은 사람들을 위해 Worker은 실제로 복잡한 내용을 다운로드하는 클래스이고 for 루프에서는 단일 다운로드가 수행됩니다. m_var은 세션을 보유한 객체가 될 것입니다.

답변

1

비 정적 데이터 멤버는 클래스의 각 인스턴스에서 별도의 인스턴스를 가지며 스레드 로컬 일 수 없습니다. 지정된 클래스의 구체적인 개체의 공유 클래스를 상속합니다. 예를 들어 클래스 Worker의 객체가 OpenMP 스레드의 스택에 생성 된 경우 (객체에 자동 저장소 클래스가있는 경우) 객체 자체는 해당 스레드에 대해 private이며 worker.m_var도 private입니다. 오브젝트가 힙에 작성되면 다른 스레드와 공유 될 수 있으므로 worker->m_var도 공유됩니다. 각 스레드 A를 제공

struct Worker 
{ 
    void work(); 

    static int m_var; 
    #pragma omp threadprivate(m_var) 
}; 

int Worker::m_var; 
Worker::m_var 하나만 정적 전역 복사본이 존재하는 경우에

및 그것 스레드 전용 제작 : 스레드 비공개 정적 스토리지 클래스의 데이터 멤버에 적용될 수

해당 스레드의 Worker의 모든 인스턴스간에 공유되는 개별 인스턴스

privatefirstprivate은 정적이든 아니든간에 클래스 데이터 멤버에 적용 할 수 없습니다 (this answer 참조).