cuda内核没有访问数组的所有元素

标签 c cuda nvidia

我编写了一个 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)数字。

如果numBlocksblockSize都为1,则访问所有元素。如果数组大小小于 4096,那么它也会访问所有元素。

最佳答案

实际上,所有值都在当前情况下打印。但由于输出控制台的缓冲区限制,您可能无法看到所有这些。尝试增加输出控制台的缓冲区大小。

此外,请记住内核中的 printf 调用是乱序执行的。此外,设备上的 printf 缓冲区存在限制,这在 documentation 中进行了说明。 .

关于cuda内核没有访问数组的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52719441/

相关文章:

c++ - 奇怪的 ATI vs Nvidia TRIANGLE_STRIP 问题

linux - 在 Tegra TK1 上使用 malloc() 与 cudaHostAlloc() 分配的数据的 CPU 内存访问延迟

python - Kivy 在切换驱动程序后找不到 Window 提供程序

C VS2010 - 堆损坏释放结构上的指针数组

performance - CUDA:为什么大于 64KB 的内存传输会阻塞调用?

c++ - 用于将 RGB 图像转换为灰度图像的共享内存 Cuda

machine-learning - 我可以在 GPU 上运行包含 seaborn 代码的 jupyter 笔记本吗?

c - 指向结构中指针的指针?

c - 结构对象数组 - 线程安全

无法访问 C 中地址处的内存