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 데르 찾을 수 없습니다 .
'count' 컴파일 타임 상수 또는 계산 시간 (컴파일러에 표시되지 않음 *)이 있습니까? OMP는 나중에 필요할 때 더 많은 스레드를 시작할 수 있으므로 향후 호출에 사용할 수 있습니다. – Zereges
기본값은 일반적으로 최대 스레드 수입니다. 상관하지 않으려면 omp_places = cores를 지원하는 openmp를 사용하십시오. – tim18
앱을 분해하고 스레드가 실제로 무엇을하는지 확인하십시오. 어쩌면 다른 일들이있을 수 있습니다. –