在设备上调用printf()时输出不完整
Incomplete output from printf() called on device
为了测试设备上的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队列之前,第一个打印元素丢失(覆盖)。
链接的文档指出缓冲区大小也可以增加。
相关文章:
- 当使用通配符和null指针调用函数时,对输出的说明
- 有没有办法简单地从 GPU 调用多个 cpp 输出文件?
- 使用静态变量的递归调用的不同输出
- cmake add_custom_command + Xcode:多输出 = 多命令调用
- 调用 cout 时如何在结构中输出常量文本?
- 我的 cout 上有一个奇怪的输出,它把答案放在第一位,然后在我调用它的地方放一个奇怪的输出.我该怎么办?
- 函数调用导致没有输出
- 使用 Node.js N-API 调用 C 函数时,不会显示预期的输出
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 当我从头文件和实现文件调用我的函数到我的主文件时,我没有得到任何输出
- 空指针(为缺少的输出数组调用的 create() 在 create,文件 /home/m/OpenCV/modules/
- 为什么在杂注 omp 关键之后多次调用 printf 会产生乱码输出?
- std::cout 如果从自定义分配器 (Visual Studio 2019) 调用,则不会输出
- 将 Linux system() 调用命令的输出重定向到仅可变的
- 干净取消在输入/输出调用中被阻止的 std::线程
- 不同的输出调用clang上的malloc应用编译器选项-00和-03
- 从缺少 printf 语句输出C++调用 C API
- 如何使用 Matlab 的多个输出调用C++函数
- 无法使用重定向标准输出调用 g++