我正在努力教自己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])
Run Code Online (Sandbox Code Playgroud)
但是,我的程序打印的值是5.387879938e-315.这肯定不像8.0.为什么从GPU返回错误的值?
我试过改变块大小,我认为不应该有什么(但谁知道).我还检查了我发送的数据类型(float64)是否与我的内核匹配.
您有类型冲突 - 您的内核需要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]
Run Code Online (Sandbox Code Playgroud)
所以一切都以单精度显式指定,你可能会有更多的运气.
| 归档时间: |
|
| 查看次数: |
97 次 |
| 最近记录: |