微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在内核之外使用CUDA printf打印设备variables

在内核之外的CUDA中打印设备variables的最佳方式是什么? 我必须做一个cudamemcpy到主机,然后打印结果值? 当我尝试使用cudamalloc创build的指针上使用printf时,程序崩溃。 看来大部分的注意力集中在内核打印,而不是普通的代码

谢谢,埃里克

C#,处理文件,“未经授权的访问”?

在linux / sys / class / gpio中写入文件时出错

问题与WPF C#应用程序产生两个主要的Windows

在Windows上的GCC:设置C可执行文件的“描述”字段?

循环遍历文件并在C中打印文件属性

“当我尝试使用cudamalloc创建的指针上使用printf时,程序崩溃”

如果你有这个:

int *d_data,*h_data; cudamalloc(&d_data,DSIZE);

你不可以做这个:

printf(" %d ",*d_data);

因为这需要在CUDA中通常非法的主机代码中取消引用设备指针( d_data )。

相反,你可以这样做:

h_data = (int *)malloc(DSIZE); cudamemcpy(h_data,d_data,DSIZE,cudamemcpyDevicetoHost); printf(" %d ",*h_data);

您也可以调查CUDA 6中新增的统一内存 ,看看它是否能满足您的需求。

而且,如评论中所述,cc2.0或更高版本的设备支持来自内核的printf (仅对设备数据进行操作)。

一种替代Robert Crovella提出的方法是通过thrust::device_pointer_cast将设备指针包装到thrust::device_pointer_cast 。 当你只需要访问设备数组中非常少的元素时,这种方式稍微快一点。 看下面的例子:

#include <thrustdevice_vector.h> void main() { const int N = 10; int *h_data = (int*)malloc(N*sizeof(int)); for (int i=0; i<N; i++) h_data[i] = 3; int *d_data; cudamalloc(&d_data,N*sizeof(int)); cudamemcpy(d_data,h_data,N*sizeof(int),cudamemcpyHostToDevice); // --- Alternative approach thrust::device_ptr<int> dev_ptr_key = thrust::device_pointer_cast(d_data); int i = 4; printf("Element number %d is equal to %dn",i,(int)*(dev_ptr_key+i)); getchar(); }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐