Если одномерные сетки слишком малы, просто используйте вместо этого двумерные (или трехмерные в Fermi с CUDA 4.0) сетки. Размерность в сетке и блочных макетах действительно только для удобства - она делает пространство выполнения похожим на обычные пространства ввода параллельных данных, с которыми работают программисты (матрицы, сетки, воксели и т. Д.). Но это лишь очень малая абстракция от базовой простой линейной схемы нумерации, которая может обрабатывать более 10 ^ 12 уникальных идентификаторов потоков за один запуск ядра.
В сетках упорядочение является основным по столбцу, поэтому, если раньше у вас была проблема с 1D сеткой, «уникальный, 1D индекс потока» был рассчитан как:
unsigned int tid = threadIdx.x + blockIdx.x * blockDim.x;
, теоретический верхний предел которого составляет 512 * 65535 = 33553920 уникальных потоков. Эквивалентная двумерная сеточная задача - это лишь простое расширение одномерного случая
size_t tidx = threadIdx.x + blockIdx.x * blockDim.x;
size_t tid = tidx + blockIdx.y * blockDim.x * GridDim.x;
с теоретическим верхним пределом 512 * 65535 * 65535 = 2198956147200 уникальных потоков. Fermi позволит вам добавить третье измерение в сетку, также с максимальным размером 65535, что дает до 10 ^ 17 потоков в одной сетке выполнения. Что довольно много.