0

次のコードを実行しようとすると、次のエラーが発生します。

Traceback (most recent call last):
  File "C:\temp\GPU Program Shell.py", line 28, in <module>
    dev=mod.get_function("lol")
  File "C:\Python33\lib\site-packages\pycuda\compiler.py", line 285, in get_function
    return self.module.get_function(name)
pycuda._driver.LogicError: cuModuleGetFunction failed: not found

コードは次のとおりです。

mod = SourceModule("""

extern "C" {
__device__ void lol(double *a)
{
    a[0]=1;
}


__global__ void kernel(double *a)
{
    const int r = blockIdx.x*blockDim.x + threadIdx.x;
    a[r] = 1;
}
}
""")

max_length = 5
a = numpy.zeros(max_length)
a_gpu = cuda.mem_alloc(a.nbytes)
cuda.memcpy_htod(a_gpu, a)
func = mod.get_function("kernel")
dev=mod.get_function("lol")
dev(a_gpu)
newa = numpy.empty_like(a)
cuda.memcpy_dtoh(newa, a_gpu)

print(newa)
print(a)

ご覧のとおり、これは PyCUDA チュートリアル コードをわずかに変更したものです。私の意図は、カーネルを起動して物事を統合し、一般的に私の人生を楽にするこのデバイス機能を呼び出すことです。少しグーグルで調べてみたところ、名前マングリングのために「extern "c"」をコードに入れる必要があることがわかり、デバイス関数の代わりにカーネルを起動するために PyCUDA を使用していたときに、これで成功しました。同じように、デバイス関数の代わりにカーネルを起動するようにコードを変更すると、希望どおりに動作します。ここで何が欠けていますか?

カーステン

Device Interface Reference ドキュメントをもう少し調べてみると、関数 get_function はグローバル関数のみを扱うように見えますか? 私はそれを正しく解釈しましたか?もしそうなら、私はやろうとしていることをすることができますか?

4

1 に答える 1

1

__device__ホスト コードから関数を呼び出すことはできません。PyCUDA チュートリアル コードがこれを行う方法を示していることを示している場合は、そのチュートリアルを参照してください。

通常のカーネル ( ) の起動__device__では実行できなかったホスト コードから関数を呼び出すことで、何を達成しようとしているのか、私にはわかりません。__global__

于 2013-10-15T04:36:07.717 に答える