为了测试设备上的printf()调用,我写了一个简单的程序,它将一个中等大小的数组复制到设备并将设备数组的值打印到屏幕上。尽管数组已正确复制到设备,但printf()函数无法正常工作,这会丢失前几百个数字。代码中的数组大小是4096.这是一个错误还是我没有正确使用此功能?谢谢你。
编辑:我的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("\n\nTotally %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("\n\n");
for(i=0;i<N;i++){
printf("%f ", rArray[i]);
if((i+1)%6 == 0) printf("\n");
}
}
答案 0 :(得分:12)
来自设备的printf具有有限的队列。它适用于小规模调试式输出,而不是大规模输出。
在内核启动之前,printf()的输出缓冲区设置为固定大小(请参阅关联的主机端API)。它是循环的,如果在内核执行期间产生的输出多于缓冲区中的输出,则会覆盖较旧的输出。
您的内核内printf输出覆盖了缓冲区,因此在将缓冲区转储到标准I / O队列之前,第一个打印元素丢失(覆盖)。
链接文档表明缓冲区大小也可以增加。