2016-11-14 2 views
0

openMP V.2.0을 사용하여 병렬 for 루프를 작성하려고합니다. 병렬 영역의 중간에서 나는 스레드 당 한 번 구성되기를 원하는 Object를 생성합니다.기본 생성자없이 OpenMP에서 코드 당 코드 한 번 실행

#pragma omp parallel for 
    for (long i = 0; i < static_cast<long>(general_triangles.size()); ++i) 
    { 
     TrianglePointer tri = general_triangles[i]; 
     if (tri.GetClassification() == TO_CLASSIFY) 
     { 
      bool tri_has_correct_normal = true; 
      // --- Construct tree once per thread --- 
      Tree tree(*(gp_boolean_operator->mp_group_manager)); 
      if (tree.IsTriangleExternal(tri, tri_has_correct_normal)) 
      { 
       tri.SetClassification(IS_EXTERNAL); 
      } 
     } 
    } 

스레드 당 한 번씩 트리를 구성하기위한 키워드가 있습니까?

대신 bood_thread_ptr을 사용 하시겠습니까?

+0

'std :: size_t '를 사용하는 대신 왜'i'를'long'으로 변환하겠습니까? – erip

+1

open_tv2.0에서 size_t가 지원되지 않기 때문에 @erip –

+0

매우 민감한 응답. :) TIL - 어리석은 것처럼 보이지만 슬프게도. – erip

답변

0

gcc: static __thread 

MSVC: static __declspec(thread) 

그러나, 성능상의 이유로는 수동으로 처리하기 위해 더 좋을 수도 작동합니다. 스레드 수에 해당하는 크기의 벡터를 사용하고 스레드 번호를 사용하여 벡터를 인덱싱합니다. 요소가 NULL의 경우, thread는 그것을 구축 할 필요가있다.

는 또한 읽기 :이 같은 How to define thread-local local static variables?

뭔가 (가 안된 점에 유의하시기 바랍니다, 그리고 내가 실제로 무슨 일을 통해 선호 제어의 정도를 제공하지 않기 때문에 나는 OMP에게 자신을 사용하지 않습니다).

std::vector<Tree *> trees; 
trees.resize(omp_get_thread_limit()); 

#pragma omp parallel for 
    for (long i = 0; i < static_cast<long>(general_triangles.size()); ++i) 
    { 
     TrianglePointer tri = general_triangles[i]; 
     if (tri.GetClassification() == TO_CLASSIFY) 
     { 
      bool tri_has_correct_normal = true; 
      // --- Construct tree once per thread --- 
      Tree *& tree = trees[omp_get_thread_num()]; 
      if (tree == NULL) 
       tree = new Tree(*(gp_boolean_operator->mp_group_manager)); 
      if (tree->IsTriangleExternal(tri, tri_has_correct_normal)) 
      { 
       tri.SetClassification(IS_EXTERNAL); 
      } 
     } 
    } 

    // delete trees afterwards 
+0

OpenMP 외부로 이동할 필요가 없습니다. –

+0

네, 필요합니다 (또는있을 수 있습니다) "정적"키워드 때문에 컴파일러가 엄청나게 처리 속도를 늦출 뮤텍스를 삽입합니다. –

+0

트리 & * 트리? 확실해? –

1

은 테스트되지 않은 코드를 다음과 같이 생각해

#pragma omp parallel 
{ 
// --- Construct one tree in each per thread --- 
    Tree tree(*(gp_boolean_operator->mp_group_manager)); 

#pragma omp for 
    for (long i = 0; i < static_cast<long>(general_triangles.size()); ++i) 
    { 
     TrianglePointer tri = general_triangles[i]; 
     if (tri.GetClassification() == TO_CLASSIFY) 
     { 
      bool tri_has_correct_normal = true; 

      if (tree.IsTriangleExternal(tri, tri_has_correct_normal)) 
      { 
       tri.SetClassification(IS_EXTERNAL); 
      } 
     } 
    } 
} 

그것은 당신이 모든 휴대용 내부, OS 독립적, OpenMP를 할 수 있음을 보여줍니다, 당신은 불필요한 정적 변수를 도입하지 않습니다.