在pycuda内核中打印时遇到问题: printf()函数不打印任何内容。
@username_4567发布了一个类似的问题,还给出了一个here的例子,@harrism在他的答案中指出了这一点。但是,我已经在pycuda example中实现了代码,没有任何东西被打印出来(尽管没有错误)。我猜问题是我使用的是开普勒GPU,示例中指定它只在费米设备上工作。
有谁知道如何使用我的开普勒GPU从pycuda内核中打印信息?也许我可以设计一种变通办法,它可以将我想要打印到CPU上的任何数据复制到CPU上,然后通过Python打印,但我宁愿避免这种情况!
我已经在网上搜索过任何有同样问题的人,但我什么也没找到。
我使用Python3.5 (Anaconda build),Spyder作为集成开发环境(从终端启动)和带有El Capitan的iMac。图形处理器为GeForce GT 755M。
发布于 2016-08-11 15:33:29
您正在尝试使用的示例中的代码没有任何错误,它非常适合在开普勒GPU上使用。问题是,CUDA运行时为printf
输出使用了一个缓冲区,该缓冲区仅由驱动程序定期刷新,并且需要由几个API调用中的任何一个触发。
我猜你是在一个交互式的python shell中测试它。在这种情况下,您应该向代码添加显式同步调用:
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
mod = SourceModule("""
#include <stdio.h>
__global__ void say_hi()
{
printf("I am %d.%d\\n", threadIdx.x, threadIdx.y);
}
""")
func = mod.get_function("say_hi")
func(block=(4,4,1))
# Flush context printf buffer
cuda.Context.synchronize()
或者,如果您添加了一行shebang行,并从命令提示符处运行未修改的代码:
$ cat hello_cuda.py
#!/usr/bin/env python
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
mod = SourceModule("""
#include <stdio.h>
__global__ void say_hi()
{
printf("I am %d.%d\\n", threadIdx.x, threadIdx.y);
}
""")
func = mod.get_function("say_hi")
func(block=(4,4,1))
$ ./hello_cuda.py
I am 0.0
I am 1.0
I am 2.0
I am 3.0
I am 0.1
I am 1.1
I am 2.1
I am 3.1
I am 0.2
I am 1.2
I am 2.2
I am 3.2
I am 0.3
I am 1.3
I am 2.3
I am 3.3
它也会起作用。在后一种情况下,它是由pycuda.autoinit
模块触发的上下文清理,它会自动刷新缓冲区。
https://stackoverflow.com/questions/38900084
复制相似问题