Я написал программу cuda для выполнения некоторых операций с большим массивом.Но когда я передаю этот массив ядру cuda, потоки не обращаются ко всем его элементам.Ниже приведена простая программа, объясняющая мой вариант использования:
#include <stdio.h>
#include <stdlib.h>
__global__
void kernel(int n){
int s = threadIdx.x + blockIdx.x*blockDim.x;
int t = blockDim.x*gridDim.x;
for(int i=s;i<n;i+=t){
printf("%d\n",i); //printing index of array which is being accessed
}
}
int main(void){
int i,n = 10000; //array_size
int blockSize = 64;
int numBlocks = (n + blockSize - 1) / blockSize;
kernel<<<numBlocks, blockSize>>>(n);
cudaDeviceSynchronize();
}
Я пробовал с другим blockSize = 256, 128, 64, etc
, он не печатает все индексы массива.В идеале, он должен печатать любую перестановку 0 to n-1
, однако он печатает меньшие (<n)
числа.
Если numBlocks
и blockSize
оба равны 1, то он получает доступ ко всем элементам.И если размер массива меньше 4096, то он также получает доступ ко всем элементам.