Прежде чем я начну, пожалуйста, помните, что в CUDA есть два уровня параллелизма: блоки и потоки.
Существуют сотни и даже тысячи независимых потоков, которые не требуют никакой синхронизации во время вычислений
Поскольку вы можете запускать до 65535 блоков на измерение, вы можете рассматривать каждый блок в cuda как эквивалент "вашего" потока.
Каждый потокимеет относительно небольшую (менее 200 КБ) область локальной памяти, содержащую специфичные для потока данные.Чтение / запись
К сожалению, большинство карт имеют ограничение общей памяти 16 КБ на блок.Так что, если вы можете понять, как справиться с этим нижним пределом, отлично.Если нет, вам нужно использовать глобальный доступ к памяти.
Каждый поток обращается к большому блоку памяти (сотни мегабайт и даже гигабайт).Эта память доступна только для чтения
Нельзя связывать такие большие массивы с текстурами или постоянной памятью.Таким образом, в данном блоке попытайтесь заставить потоки читать непрерывные порции данных для лучшей производительности.
Для каждого доступа к глобальной памяти будет как минимум два доступа к локальной памяти.быть много веток в алгоритме
Поскольку вы по сути заменяете один поток в своей первоначальной реализации блоком в cuda, вы можете немного пересмотреть код, чтобы попытаться реализоватьПараллельная версия "на код потока" тоже.
На первый взгляд, это может быть непонятно, но немного подумайте.Любой алгоритм, имеющий сотни / тысячи независимых частей без синхронизации, отлично подходит для параллельной реализации, даже с cuda.