2017-10-29 6 views
-1

for 루프를 병렬 처리하려고합니다. 대략 :OpenMP는 놀라 울 정도로 많은 수의 코어를 사용합니다.

#pragma omp parallel 
{ 
#pragma omp for 
    for(int i=0;i<count;++i){ 
     some_heavy_function_call() 
    } 
} 

디버깅 및 count=2 테스트가 사용된다. some_heay_function_call()의 문자 수는 입니다.

코어 수는 2가 될 것으로 예상됩니다. 그러나 OS (Ubuntu)에서는 programm가 8 개의 스레드 (시스템에서 최대 값)를 사용한다고 말합니다.

함수가 2 번 호출되면 문제가 내가 루프를 잘못 수행 한 것 같지 않습니다.

최대 2 개의 쓰레드를 사용해야한다는 가정이 잘못 되었습니까? 무슨 일이 벌어지고 있지 않습니까?

업데이트 : 나는 분명하지 않았습니다. 나는 8 개의 스레드가 생성된다는 것을 의아스럽게 생각하지 않는다. 모두 100 % 가깝지 않은가 궁금합니다. 죄송합니다.

업데이트 2 : 나는 GDB로 디버깅 및 스레드를 전환하면, 나는 2 개 스레드 함수 호출과 다른 사람에서 찾을 : Verzeichnis의 nicht의 gefunden는 파일이나 디렉토리를 의미

(gdb) #1 0x00007ffff6267e22 in ??() from /usr/lib/x86_64-linux-gnu/libgomp.so.1 
(gdb) #2 0x00007ffff6b176da in start_thread (arg=0x7ffff2fc0700) at pthread_create.c:456 
456 pthread_create.c: Datei oder Verzeichnis nicht gefunden. 
(gdb) #3 0x00007ffff5d7bd7f in clone() at ../sysdeps/unix/sysv/linux/x86_64/clone.S:105 
105 ../sysdeps/unix/sysv/linux/x86_64/clone.S: Datei oder Verzeichnis nicht gefunden. 

Datei 데르 찾을 수 없습니다 .

+0

'count' 컴파일 타임 상수 또는 계산 시간 (컴파일러에 표시되지 않음 *)이 있습니까? OMP는 나중에 필요할 때 더 많은 스레드를 시작할 수 있으므로 향후 호출에 사용할 수 있습니다. – Zereges

+0

기본값은 일반적으로 최대 스레드 수입니다. 상관하지 않으려면 omp_places = cores를 지원하는 openmp를 사용하십시오. – tim18

+0

앱을 분해하고 스레드가 실제로 무엇을하는지 확인하십시오. 어쩌면 다른 일들이있을 수 있습니다. –

답변

0

OpenMP는 일반적으로 코어만큼 많은 스레드를 사용합니다. 더 나은 아이디어가 있다면 번호를 직접 설정하십시오.

{ 
    omp_set_num_threads(2); 
    #pragma omp parallel for 
    for(int i=0;i<count;++i){ 
     some_heavy_function_call(); 
    } 
} 
+0

'OMP_NUM_THREADS' 환경 변수를 사용하여 스레드 수를 조정할 수도 있습니다. 그러면 프로그램이 더 유연 해집니다 (실행마다 변경 될 수 있음). –