1

我正在尝试自学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)是否与我的内核匹配。

4

1 回答 1

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]

所以一切都以单精度明确指定,你可能会有更多的运气。

于 2012-11-07T20:12:20.473 回答