我正在努力教自己CUDA。到目前为止这并不容易,但我也不轻易放弃:)
我创建了一个非常简单的程序。它只返回GPU的值。
import pycuda.driver as cuda
from pycuda.compiler import SourceModule
import pycuda.autoinit
import numpy as np
returnValue = np.zeros(1)
mod = SourceModule("""
__global__ void myVeryFirstKernel(float* returnValue) {
returnValue[0] = 8.0;
}
""")
func = mod.get_function('myVeryFirstKernel')
func(cuda.InOut(returnValue), block=(1024, 1, 1), grid=(1, 1))
print str(returnValue[0])
但是,我的程序打印的值是5.387879938e-315
。这肯定不像8.0
。为什么从GPU返回错误的值?
我已经尝试改变块大小,我认为不应该做任何事情(但谁知道)。我还检查过我发送的数据类型(float64)是否匹配我的内核。
答案 0 :(得分:5)
您有类型冲突 - 您的内核需要32位单精度值,但您要传递64位双精度值。如果您重写代码如下:
returnValue = np.zeros(1, dtype=np.float32)
mod = SourceModule("""
__global__ void myVeryFirstKernel(float* returnValue) {
returnValue[0] = 8.0f;
}
""")
func = mod.get_function('myVeryFirstKernel')
func(cuda.InOut(returnValue), block=(1024, 1, 1), grid=(1, 1))
print returnValue[0]
以便以单精度显式指定所有内容,您可能会有更多的运气。