Я использую pycuda для создания релятивистского raytracer. В принципе, для каждого «пикселя» в большом двумерном массиве мы должны решить систему из 6 ОДУ с помощью Рунге Кутты. Поскольку каждая интеграция не зависит от остальных, это должно быть очень просто. Другие люди достигают этого, используя C/C++ CUDA с отличными результатами (см. this project).Pycuda: Лучший способ вызвать Kernel несколько раз
Проблема возникает в том, что я не знаю, как это лучший способ сделать это. Я пишу Ядро, которое выполняет некоторые шаги Runge Kutta, а затем возвращает результаты в CPU. Это ядро называется много раз, чтобы интегрировать весь лучи. Проблема по какой-то причине очень медленно. Конечно, я знаю, что передача памяти на самом деле является узким местом в CUDA, но поскольку это очень медленно, я начинаю думать, что я делаю что-то неправильно.
Было бы здорово, если бы вы порекомендовали мне лучшие методы программирования для этого случая. (Использование pycuda). Некоторые вещи, которые я брожу:
- Нужно ли мне создать новый контекст при достижении вызова ядра?
- Существует способ не должен передачи памяти от GPU к CPU, то есть, начиная с ядром, делая паузу, чтобы получить его некоторой информации, и ее пересчета повторить.
- Каждая итерация RK4 занимает примерно полсекунды, что является безумным (также по сравнению с кодом CUDA в ссылке, которая выполняет некоторую аналогичную операцию). И я думаю, что это связано с чем-то не так с тем, как я использую pycuda, поэтому, если вы можете объяснить лучший способ сделать такую операцию наилучшим образом, это может быть здорово !.
Чтобы уточнить: причина, по которой я должен приостановить/перезапустить ядро, связана с сторожевым псом. Ядро более 10 секунд было убито сторожевым псом.
Спасибо заранее!
Это не ответ на исходный вопрос. Просьба рассмотреть возможность публикации этого вопроса как * нового * –