Можете ли вы присвоить ядру в CUDA определенное количество c ядер? - PullRequest
0 голосов
/ 11 марта 2020

У меня Nvidia GeForce GTX 1080 с 20 потоковыми мультипроцессорами. Я хочу портировать систему обнаружения столкновений, используя CUDA, которая имеет несколько ветвей в коде в зависимости от типа объектов, находящихся в столкновении (например: код для проверки того, находятся ли сфера и цилиндр в столкновении, отличается от кода для проверки столкновений между сфера и другая сфера). Чтобы повысить производительность и уменьшить расхождение кода, я думал о параллельном запуске каждой из этих веток в отдельных ядрах, поскольку мое устройство поддерживает параллельное выполнение ядра. Есть ли способ назначить конкретное c количество ядер CUDA каждому ядру в этом случае?

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

Надеюсь, кто-то, кто пробовал что-то подобное, может направить меня или направить меня в правильном направлении. Большое спасибо заранее!

1 Ответ

1 голос
/ 11 марта 2020

Во-первых, вы не можете напрямую отобразить последовательный код (код ЦП) в код GPU (параллельный код). Вам необходимо понять основные принципы c и сопоставить вашу проблему с параллельной архитектурой. Я бы порекомендовал вам сначала изучить параллельное программирование и основы CUDA, прежде чем пытаться перенести ваш код на GPU. В противном случае вы, вероятно, достигнете еще меньшей производительности, чем код процессора. Для столкновения объектов и других распространенных параллельных задач вы можете прочитать эти отличные онлайн-книги: https://developer.nvidia.com/gpugems/gpugems3/part-v-physics-simulation/chapter-32-broad-phase-collision-detection-cuda.

Однако, по вашему вопросу, вы можете запустить разные ветви в одном ядре, округлив границы до размера деформации. Там не будет дивергенции, когда у вас есть разные пути выполнения между различными деформациями. Эти деформации автоматически распараллеливаются Cuda. Вам не нужно беспокоиться о том, на каком SM они работают. Следующий код не имеет расхождения.

int idx= threadIdx.x + blockIdx.x * blockDim.x;
if (idx < offset[0]) {  //offset[0] is multiple of 32
    // task number 0
}
else if (idx < offset[1]) { //offset[1] is multiple of 32
    // task number 1
}
else if (idx < offset[2]) { //offset[2] is multiple of 32
    // task number 2
}
...
...