在设备上调用printf()时输出不完整

Incomplete output from printf() called on device

本文关键字:输出 调用 printf      更新时间:2023-10-16

为了测试设备上的printf()调用,我编写了一个简单的程序,它将一个中等大小的数组复制到设备上,并将设备数组的值打印到屏幕上。虽然数组被正确复制到设备,但printf()函数不能正确工作,它丢失了前几百个数字。代码中的数组大小为4096。这是一个bug还是我没有正确使用这个函数?提前感谢。

编辑:我的gpu是GeForce GTX 550i,计算能力2.1

我代码:

#include<stdio.h>
#include<stdlib.h>
#define N 4096
__global__ void Printcell(float *d_Array , int n){
    int k = 0;
    printf("n=========== data of d_Array on device==============n");
    for( k = 0; k < n; k++ ){
        printf("%f  ", d_Array[k]);
        if((k+1)%6 == 0) printf("n");
    }
    printf("nnTotally %d elements has been printed", k);
}
int main(){
    int i =0;
    float Array[N] = {0}, rArray[N] = {0};
    float *d_Array;
    for(i=0;i<N;i++)
        Array[i] = i;

    cudaMalloc((void**)&d_Array, N*sizeof(float));
    cudaMemcpy(d_Array, Array, N*sizeof(float), cudaMemcpyHostToDevice);
    cudaDeviceSynchronize();
    Printcell<<<1,1>>>(d_Array, N);    //Print the device array by a kernel
    cudaDeviceSynchronize();
    /* Copy the device array back to host to see if it was correctly copied */   
    cudaMemcpy(rArray, d_Array, N*sizeof(float), cudaMemcpyDeviceToHost);
    printf("nn");
    for(i=0;i<N;i++){
        printf("%f  ", rArray[i]);
        if((i+1)%6 == 0) printf("n");
    }
}

设备的printf队列有限。它用于小规模的调试式输出,而不是大规模的输出。

参考程序员指南:

printf()的输出缓冲区在内核启动前设置为固定大小(参见关联的主机端API)。它是循环的,如果在内核执行期间产生的输出超过了缓冲区的容量,那么旧的输出将被覆盖。

您的内核内printf输出溢出了缓冲区,因此在缓冲区被转储到标准I/O队列之前,第一个打印元素丢失(覆盖)。

链接的文档指出缓冲区大小也可以增加。