为什么我的数组没有设置?

时间:2012-11-07 19:18:38

标签: cuda pycuda

我正在努力教自己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)是否匹配我的内核。

1 个答案:

答案 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]

以便以单精度显式指定所有内容,您可能会有更多的运气。