1

私は pyCUDA に入ったばかりのレクリエーション pythonista です。pyCUDA を使用して線形補間 (lerp) を実装する方法を理解しようとしています。CUDA CG 機能は次のとおりです。http://http.developer.nvidia.com/Cg/lerp.html

私の最終的な目標は、加重ランダム ポイントのセットからの pycuda の双一次補間です。私は C や CUDA をプログラミングしたことがなく、学習しながら学んでいます。

これは私が得た距離です:

import pycuda.autoinit
import pycuda.driver as drv
import pycuda.compiler as comp

lerpFunction = """__global__ float lerp(float a, float b, float w)
{
    return a + w*(b-a);
}"""

mod = comp.SourceModule(lerpFunction) # This returns an error telling me a global must return a void. :(

これに関するヘルプは素晴らしいでしょう!

4

1 に答える 1

1

エラーメッセージはかなり明白です - CUDA カーネルは値を返すことができず、宣言する必要がありvoid、変更可能な引数はポインターとして渡されます。次のように、lerp の実装をデバイス関数として宣言する方が理にかなっています。

__device__ float lerp(float a, float b, float w)
{
    return a + w*(b-a);
}

次に、補間が必要な各値に対してカーネル内から呼び出されます。あなたのlerp関数には、便利なCUDAカーネルになるための多くの「インフラストラクチャ」が欠けています。


編集: 同じ行に沿った本当に基本的なカーネルは、次のようになります。

__global__ void lerp_kernel(const float *a, const float *b, const float w, float *y)
{
    int tid = threadIdx.x + blockIdx.x*blockDim.x; // unique thread number in the grid
    y[tid] = a[tid] + w*(b[tid]-a[tid]);
}
于 2012-01-06T00:35:35.880 に答える