C ++ Raytracer МногопользовательскийC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C ++ Raytracer Многопользовательский

Сообщение Anonymous »

Примечание: с дальнейшим тестированием я понял, что оптимизация компилятора может вызвать проблему, как это видно из записанной временной таблицы внизу, мой вопрос все еще стоит (почему версия единого потока будет медленнее)
Я хотел добавить многопоточное в моем лучшем трассере, чтобы повысить производительность. Я начал с попытки создать пул темы, но это стало довольно сложным, поэтому я хотел посмотреть, как будет работать программа, если я просто разделил изображение, которое я пытался отображать на произвольное количество горизонтальных блоков (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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Сетка Raytracer не центрируется правильно
    Anonymous » » в форуме JAVA
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Нарисуйте каждый визуализированный линию Scanline в Windowed Raytracer
    Anonymous » » в форуме C++
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Нарисуйте каждый визуализированный линий Scanline в Windowed Raytracer?
    Anonymous » » в форуме C++
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Нарисуйте каждый визуализированный линий Scanline в Windowed Raytracer? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Многопользовательский проект laravel не работает в подпапке
    Anonymous » » в форуме Php
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»