0

公式の例に見られるように、テンプレートを使用してカーネルを変更せずに共有メモリに配列を作成するにはどうすればよいですか。または、テンプレートを使用するのが公式の方法ですか?

PyOpenCL では、カーネル引数を設定してローカル メモリに配列を作成できます

kernel.set_arg(1,numpy.uint32(a_width))

... 
KERNEL_CODE = """
__kernel void matrixMul(__local float* A_temp,...)
    { ...} """
4

2 に答える 2

3

CUDA はカーネル実行時の動的共有メモリ割り当てをサポートしていますが、メカニズムは OpenCL とは少し異なります。CUDA ランタイム API では、動的に割り当てられた/サイズ変更された共有メモリを使用するカーネルと、メモリのサイズを変更するための起動は、次の構文を使用します。

__global__ void kernel(...)
{
    extern __shared__ typename buffer[];

    ....
}
....
kernel <<< griddim, blockdim, sharedmem, streamID >>> (...)

sharedmem、バッファに割り当てられるブロックごとの合計バイト数です。

PyCUDA では、同じメカニズムが次のように機能します。

mod = SourceModule("""
    __global__ void kernel(...)
    {
        extern __shared__ typename buffer[];

        ....
    }
  """)

func = mod.get_function("kernel")
func.prepare(..., shared=sharedmem)
func.prepared_call(griddim,blockdim,...)

メソッドに渡された共有メモリの割り当てサイズを使用しprepareます。

于 2011-06-27T10:52:19.177 に答える
0

私はその質問を完全には理解していません。私はPythonを使用していませんが、OpenCLについてはよく知っています。

OpenCLでは、共有/ローカルメモリバッファを作成するための2つの可能性があります。

1)質問にあるカーネルパラメータを追加します。2)次のようにカーネル自体の中で静的にバッファを定義してください。

__local buffer[1024];

OpenCLでこれを行う他の機会はありません。OpenCLに渡すカーネルコード文字列をどのように作成するかは別の質問であり、Pythonに関連しています。私はこれに関する専門家ではありません。

于 2011-06-24T13:17:26.050 に答える