Я разрабатываю Ray Tracer на C ++, используя SDL и Pthread. У меня проблемы с тем, чтобы моя программа использовала два ядра. Потоки работают, но они не используют оба ядра до 100%. Для интерфейса SDL я пишу непосредственно в его память, SDL_Surface.pixels, поэтому я предполагаю, что это не может быть блокировка SDL.
Моя функция потока выглядит так:
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);
}
}
Примечание: scene-> 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 не жалуется.
Моя проблема лучше всего проиллюстрирована на графике использования процессора во время выполнения:
(источник: jopsen.dk )
Как видно из графика, моя программа использует только одно ядро за раз, затем время от времени переключается между двумя, но это не приводит к тому, что оба достигают 100%.
Что в мире я сделал не так? Я не использую мьютекс или семафор в сцене.
Что я могу сделать, чтобы найти ошибку?
Также, если я укажу while (true) вокруг scene-> renderPixel (), я могу увеличить оба ядра до 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
Примечание: