저는 OpenMP를 처음 사용하고 있으며 병렬 처리하려고하는 몬테카를로 코드가 있습니다. OpenMP - for 루프의 스레드 생성 및 종료시 오버 헤드
나는이 a를new_value()
함수를 호출 순차적으로 실행되어야합니다 - 루프 :
void new_value()
{
#pragma omp parallel default(shared)
{
int thread_rank = omp_get_thread_num();
#pragma omp for schedule(static)
for(int i = 0; i < N; i++)
arr[i] = update(thread_rank);
}
}
작동하지만이 :
for(int i = 0; i < MAX_VAL; i++)
new_value();
이 기능은 각 통화에 병렬 영역이 열립니다 스레드의 생성 및 종결과 관련하여 상당한 양의 오버 헤드가 발생합니다. 루프를 병렬 처리하지 않고 루프를 시작하기 전에 누군가 스레드를 생성하고 (thread_rank
에 도달하는) 방법을 알고 있는지 궁금합니다.
같은 일을 묻는 몇 가지 질문이 있습니다하지만 그들은 그 예는 다음을 포함 하나 틀리거나 답이 있습니다 :
This question가 유사한 일을 묻는하고 대답에 #pragma omp single
를 사용하여 다음 병렬 영역을 작성하고 제안 가장 바깥 쪽 루프가 아니라 'Joe C'가 답변의 코멘트에서 말한 것처럼 이것이 작동하지 않습니다. 프로그램이 멈췄는지 확인할 수 있습니다.
This question가 정확한 같은 일을 요청하지만, (선택 해제) 대답은 단지 인 루프 4000 * num_threads
를 실행하는 가장 바깥 쪽 루프를 parallelise하는 것도 무엇 아스 커 원하는도 내가 원하는.
대단한 설명에 감사드립니다. 나는 약간의 후속 질문을 가지고있다. (만약 마음에 들지 않는다면) : 어떻게하면 각 스레드가 원래 생각했던 것처럼 for 루프를 실행시킬 수 있을까? 즉,'num_threads * MAX_VAL' 번? – BodneyC
실제로 실제로'num_threads * MAX_VAL'이 실행되지만 작업 공유로 인해 내부 루프 반복은'MAX_VAL * N '회 실행됩니다. 그러므로 내부의'omp for'를 제거하면 내부 루프 본문이'num_threads * MAX_VAL * N' 번 실행됩니다. – Zulan
스팟이 켜져 있습니다. 다시 한번 감사드립니다. – BodneyC