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 ビットの double 値を渡しています。コードを次のように書き直すと、次のようになります。

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 に答える