我编写了一个 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,那么它也会访问所有元素。
最佳答案
实际上,所有值都在当前情况下打印。但由于输出控制台的缓冲区限制,您可能无法看到所有这些。尝试增加输出控制台的缓冲区大小。
此外,请记住内核中的 printf
调用是乱序执行的。此外,设备上的 printf
缓冲区存在限制,这在 documentation 中进行了说明。 .
关于cuda内核没有访问数组的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52719441/