【发布时间】:2019-03-14 03:19:17
【问题描述】:
我编写了一个 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,那么它也正在访问所有元素。
【问题讨论】:
-
你是怎么数数的?
-
我将该程序的输出通过管道传输到文件然后
cat filename | wc -l -
如果有帮助,请考虑接受任何有效的答案。