Рисование треугольников с CUDA

Я пишу свою собственную графическую библиотеку (да, ее домашняя работа:) и использование cuda, чтобы сделать весь рендеринг и вычисления быстро.

У меня есть проблема с рисованием заполненных треугольников. Я записал этому такой способ, которым процессом тянут один треугольник. Это работает довольно прекрасное, когда существует много небольших треугольников на сцене, но это повреждает производительность полностью, когда треугольники являются большими.

Моя идея состоит в том, чтобы сделать две передачи. В первом вычисляют, только вкладка с информацией о строках развертки (потяните отсюда дотуда). Это было бы треугольным вычислением для каждого процесса как в текущем алгоритме. И во второй передаче действительно тянут строки развертки больше чем с одним процессом на треугольник.

Но это будет достаточно быстро? Возможно, существует некоторое лучшее решение?

7
задан harrism 25 September 2012 в 22:43
поделиться

3 ответа

Вы можете сделать это в блоке File.open:

Dir.chdir 'C:/Users/name/Music'
music = Dir['C:/Users/name/Music/*.{mp3, MP3}']
puts 'what would you like to call the playlist?'
playlist_name = gets.chomp + '.m3u'

File.open playlist_name, 'w' do |f|
  music.each do |z|
    f.puts z
  end
end
-121--644158-

Вы можете проверить этот блог : Конвейер визуализации программного обеспечения в CUDA . Я не думаю, что это оптимальный способ сделать это, но, по крайней мере, автор делится некоторыми полезными источниками.

Во-вторых, прочитайте документ : Программируемая архитектура параллельного рендеринга . Я думаю, что это одна из самых последних статей, и она также основана на CUDA.

Если бы я должен был сделать это, то я пошел бы с Параллельный Данным Трубопровод Растеризации как в Larrabee (который является TBR), или даже REYES, и приспособьте его к CUDA:

http://www.ddj.com/architect/217200602 http://home.comcast.net / ~ tom_forsyth/larrabee/Standford%20Forsyth%20Larrabee%202010.zip (см. вторую часть представления)

http://graphics.stanford.edu/papers/mprast /

3
ответ дан 7 December 2019 в 18:43
поделиться

По умолчанию C # не проверяет арифметическое переполнение целых чисел. Это значение можно изменить с помощью параметра компилятора /checked или путем включения функции «Проверка на арифметическое переполнение/неполноту» в Visual Studio (свойства проекта - Build - Advanced).

Можно использовать флажки и без флажков ключевые слова , чтобы переопределить значение по умолчанию в каждом конкретном случае. Если вы полагаетесь на проверку принятия занимать место в части кода, явное включение его с помощью галочки было бы хорошей идеей.

int j = checked(i * 2);

checked
{
    int j = i * 2;
    // Do more stuff
}

Обратите внимание, что операции плавающего пункта никогда не вызывают OverflowException , а десятичные - OverflowException . См. также Операторы C # .

-121--986720-

Рекомендуется несколько раз использовать POST вместо GET. Я настоятельно рекомендую ПРОТИВ выбора действия HTTP по тому, как выглядит URL. Этот выбор отличается от того, как он отображается в браузере.

Краткий обзор:

http://www.w3.org/2001/tag/doc/whenToUseGet.html#checklist

-121--4950909-

Я подозреваю, что у вас есть некоторые неправильные представления о CUDA и о том, как ее использовать, тем более что вы ссылаетесь на «процесс», когда в терминологии CUDA такой вещи нет.

Для большинства приложений CUDA есть две важные вещи для достижения хорошей производительности: оптимизация доступа к памяти и обеспечение того, чтобы каждый «активный» поток CUDA в коробке выполнял ту же операцию, что и другие активные потоки в коробке. Оба эти слова звучат так, будто они важны для вашего приложения.

Чтобы оптимизировать доступ к памяти, необходимо убедиться, что операции чтения из глобальной памяти и записи в глобальную память объединены. Подробнее об этом можно прочитать в руководстве по программированию CUDA, но это, по сути, означает, что смежные потоки в полуоснове должны считываться из смежных ячеек памяти или записываться в них. Кроме того, каждый поток должен считывать или записывать 4, 8 или 16 байт одновременно.

Если образец доступа к памяти является случайным, может потребоваться использовать текстурную память. При необходимости обращения к памяти, считанной другими потоками в блоке, следует использовать общую память.

В вашем случае я не уверен, каковы ваши входные данные, но вы должны, по крайней мере, убедиться, что ваши записи объединены. Вам, вероятно, придется вложить некоторое нетривиальное количество усилий, чтобы ваши чтения работали эффективно.

Во второй части рекомендуется, чтобы каждая нить CUDA обрабатывала по одному пикселю на выходном изображении. С помощью этой стратегии следует следить за циклами в ядрах, которые будут выполняться дольше или короче в зависимости от данных для каждого потока. Каждая резьба в деформациях должна выполнять одинаковое количество шагов в одном и том же порядке. Единственное исключение из этого состоит в том, что не существует реального ограничения производительности за то, что некоторые нити в основе не выполняют никаких операций, в то время как остальные нити выполняют одну и ту же операцию вместе.

Таким образом,Я рекомендую проверять каждую нить, находится ли ее пиксель внутри заданного треугольника. Если нет, то он ничего не должен делать. Если это так, он должен вычислить выходной цвет для этого пикселя.

Кроме того, я настоятельно рекомендую читать больше о CUDA, так как кажется, что вы прыгаете в глубокий конец, не имея хорошего понимания некоторых основных основ.

0
ответ дан 7 December 2019 в 18:43
поделиться

Не хочу показаться грубым, но разве не для этого и предназначены графические карты? Похоже, что использование стандартных OpenGL и Direct3D API имело бы больше смысла.

Почему бы не использовать API для базового рендеринга, а не CUDA, который гораздо ниже по уровню? Тогда, если вы хотите выполнять дополнительные операции, которые не поддерживаются, вы можете использовать CUDA, чтобы применить их сверху. А может быть, реализовать их в виде шейдеров.

-1
ответ дан 7 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: