그래픽 용 SDL과 스레드 용 pthread를 사용하여 C++에서 간단한 광선 추적 프로그램을 만들고 있습니다. 그리고 두 개의 코어를 사용하여 프로그램을 만드는 데 문제가 있습니다. 스레드는 작동하지만 두 코어를 100 %로 구동하지 않습니다. SDL 인터페이스를 사용하기 위해 SDL_Surface.pixels 메모리에 직접 씁니다. 따라서 SDL 잠금을 사용할 수 없다고 가정합니다.다중 코어를 사용하기 위해 pthread를 사용할 때의 문제
void* renderLines(void* pArg){
while(true){
//Synchronize
pthread_mutex_lock(&frame_mutex);
pthread_cond_wait(&frame_cond, &frame_mutex);
pthread_mutex_unlock(&frame_mutex);
renderLinesArgs* arg = (renderLinesArgs*)pArg;
for(int y = arg->y1; y < arg->y2; y++){
for(int x = 0; x < arg->width; x++){
Color C = arg->scene->renderPixel(x, y);
putPixel(arg->screen, x, y, C);
}
}
sem_post(&frame_rendered);
}
}
참고 : 장면 -> renderPixel는 const를, 그래서 두 스레드가 같은 메모리에서 읽을 수 가정
내 스레드 기능은 다음과 같습니다.
//Signal a new frame
pthread_mutex_lock(&frame_mutex);
pthread_cond_broadcast(&frame_cond);
pthread_mutex_unlock(&frame_mutex);
//Wait for workers to be done
sem_wait(&frame_rendered);
sem_wait(&frame_rendered);
//Unlock SDL surface and flip it...
참고 : 내 메인 루프에서 내가 사용하여 이러한 작업을, 이렇게 두 작업자 스레드가 나는 또한 생성하고 동기화 대신 스레드에 가입 시도했습니다. "-lpthread -D_POSIX_PTHREAD_SEMANTICS -pthread"로 컴파일하고 gcc는 불평하지 않습니다.
최상의 실행 중에 CPU 사용률의 그래프를 이용하여 도시되어 내 문제 : CPU usage during execution. http://jopsen.dk/downloads/processor_usage.png
그래프에서 본 내 프로그램은 한번 그 두 매의 전환, 한 번에 하나 개의 코어를 사용하는 수 있듯이 그러나 잠시 후 100 %로 향상되지는 않습니다. 내가 뭘 잘못 했니? 장면에서 뮤텍스 나 세마포어를 사용하지 않습니다. 버그를 찾으려면 어떻게해야합니까?
scene-> renderPixel() 주위에 while (true)를두면 두 코어를 모두 100 %로 푸시 할 수 있습니다. 그래서 이것이 오버 헤드로 인해 발생했다고 생각했지만 복잡한 장면이있는 경우 0.5 초 (예 : FPS : 0.5) 만 동기화합니다. 내 버그가 무엇인지 말해주는 것이 쉽지 않을 수도 있지만, 디버깅에 대한 접근법도 좋을 것입니다 ... 전에 pthreads로 연주하지 않았습니다 ...
하드웨어 또는 커널 문제, 내 커널은 다음과 같습니다
$uname -a
Linux jopsen-laptop 2.6.27-14-generiC#1 SMP Fri Mar 13 18:00:20 UTC 2009 i686 GNU/Linux
참고 : 나는 어둠 속에서 야생 자상을하고 작업자 스레드가 조건 변수를 기다리는 많은 시간을 소비하고 말할 것
이것은 도움이되었습니다. 이미지의 절반이 아닌 두 번째 줄마다 렌더링이 거의 동시에 같은 시간에 렌더링된다는 것을 발견했습니다. 결국 결국 코어를 100 %로 향상 시켰지만 프레임 속도는 향상되지 않았습니다 :) - 아니면 그냥 잘못 측정 한 것입니다 ... 도움을 주셔서 감사합니다 ... – jonasfj
하하, 첫 번째 최적화 단계는 항상 n 프로세서와 병렬 알고리즘은 단일 프로세서를 사용하는 것보다 효율적입니다. 계속 노력하면 결국 개선 될 것입니다. – Ben