Как назначить часть 2D-массива потокам CUDA? - PullRequest
0 голосов
/ 26 ноября 2011

Распределение некоторой части 1D в поток легко, мы можем использовать базовый указатель на чанк в качестве одного из аргументов ядра, но как добиться того же в 2D массиве, кажется трудным, потому что в 2D массиве чанк может быть сам 2D массивом, так чтоКак управлять указателем в этом случае? Пожалуйста, помогите

1 Ответ

1 голос
/ 27 ноября 2011

Во-первых, потоки совершенно не имеют отношения к вашему вопросу, они не имеют отношения к тому, о чем вы спрашиваете.

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

Имейте в виду, чтоИспользование массивов указателей в CUDA - очень плохая идея в 90% реальных приложений.Производительность в нетривиальных случаях значительно хуже, чем при использовании линейной тональной памяти (вы фактически удваиваете задержку доступа к памяти для каждого дополнительного уровня перенаправления указателя, который вы добавляете к данным, которые будут считываться и записываться в ядре).Несколько IOP, необходимых для индексации внутри ядра, намного дешевле.Использование массивов указателей также делает хост и устройство гораздо более сложным, чем это требуется в большинстве случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...