Я хотел добавить многопоточное в моем лучшем трассере, чтобы повысить производительность. Я начал с попытки создать пул темы, но это стало довольно сложным, поэтому я хотел посмотреть, как будет работать программа, если я просто разделил изображение, которое я пытался отображать на произвольное количество горизонтальных блоков (4), а затем просто Назначьте поток каждому блоку, запустив мой обычный код рендеринга для этих кусков. Времена гораздо хуже. Это как результат накладных расходов на создание потока? Или что -то еще, что мне не хватает. Накладные расходы поступают из системных вызовов (не знаю, является ли это правильным термином) try_to_wake_up и (при запуске пула потоков) native_queud_spin_lock_slowpath
Примечания к реализации: < /p>
рендеринг вызывается только один раз во время выполнения программы < /li>
Изображение составляет 400 x 225 пикселей (соотношение сторон 16/9) < /li>
Это рендеринг по 100 образцов на пиксель по умолчанию < /li>
У меня есть оптимизация компилятора -01 < /li>
Время измеряется следующим образом: < /li>
< /ul>
Код: Выделить всё
const auto start {std::chrono::steady_clock::now()};
cam.render(world, "./out.ppm");
const auto end {std::chrono::steady_clock::now()};
const std::chrono::duration elapsed_seconds{end - start};
< /code>
m_buffer-мой класс кадров: < /li>
< /ul>
class FrameBuffer
{
private:
int width, height;
std::vector m_buffer;
void printPixel(std::ostream& out, int pixel_x, int pixel_y){
vec3 pixel = m_buffer[pixel_y * width + pixel_x];
out sample();
vec3f direction = originPixel + ((pixelX + sample.x) * pixelDeltaRight) + ((pixelY + sample.y) * pixelDeltaDown);
// make direction go from camera position out
direction = direction - this->position;
return Ray(this->position, direction);
}
< /code>
Here is the code where the multi-threaded rendering occurs:
void render(const Scene &scene, const std::string &filename)
{
initialize();
float sampleWeight = 1.0 / samplesPerPixel;
int workerRows = imageHeight / 4 + (imageHeight % 4 > 0);
int startY {};
int endY {};
auto job = [this, &scene, &sampleWeight](int startY, int endY)
{
for (int pixelY = startY; pixelY < endY; ++pixelY)
{
for (int pixelX = 0; pixelX < imageWidth; ++pixelX)
{
vec3f pixelColor(0.0);
for (int sample = 0; sample < samplesPerPixel; ++sample)
{
pixelColor += shade(getRay(pixelX, pixelY), maxDepth, scene);
}
m_buffer.setPixel(pixelColor * sampleWeight, pixelX, pixelY);
}
}
};
std::vector threads;
for (int i = 0; i < 4; ++i)
{
endY = std::min(startY + workerRows, imageHeight);
threads.push_back(std::thread(job, startY, endY));
startY = endY;
}
for (auto &thread : threads)
thread.join();
m_buffer.writeToPPM(filename);
}
< /code>
And here are the time results (in seconds), rendered at the settings mentioned above:
Compiler Optimization
Single Thread
Multi Thread
none
23.89
16.23
-01
3.33
12.45
-03
3.45
12.93
Подробнее здесь: [url]https://stackoverflow.com/questions/79436713/c-raytracer-multi-threading-resulting-in-performance-decrease[/url]