1

__constant をデバイスにコピーしてホストに戻すための cudaMemcpyToSymbol の OpenCl バージョンを教えてもらえますか?
または、通常の clenquewritebuffer(...) は仕事をしますか?
フォーラムで多くのヘルプが見つかりませんでした。実際には、数行のデモで十分です。

また、定数キャッシュを使用する CUDA と同じ種類の最適化を opencl で期待できますか?

ありがとう

4

2 に答える 2

3

cudaMemcpyToSymbol()カーネルで定数を設定するために人々が使用し、コンパイラがコードを最適化するときにそれらの定数を利用できるのを見てきました。そのような定数をカーネルに渡すために openCL でメモリ バッファを設定した場合、コンパイラはそれらを使用してコードを最適化できませんでした。

代わりに、私が見つけた解決策はcudaMemcpyToSymbol()、をコンパイラのシンボルを定義する文字列に置き換えることです。-D FOO=barコンパイラは、シンボルFOOを値に設定するための形式で定義を取得できますbar

于 2012-09-06T23:22:26.567 に答える
0

OpenCL.Netについてはわかりませんが、プレーンなOpenCLでは:はい、十分です(フラグが設定されclenquewritebufferたバッファーを作成することを忘れないでください)。CL_MEM_READ_ONLY

これは、Nvidia GPU Computing SDK(OpenCL / src / oclQuasirandomGenerator / oclQuasirandomGenerator.cpp)のデモです。

c_Table[i] = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY, QRNG_DIMENSIONS * QRNG_RESOLUTION * sizeof(unsigned int),     
                 NULL, &ciErr);
ciErr |= clEnqueueWriteBuffer(cqCommandQueue[i], c_Table[i], CL_TRUE, 0, 
            QRNG_DIMENSIONS * QRNG_RESOLUTION * sizeof(unsigned int), tableCPU, 0, NULL,  NULL);

CUDAとOpenCLのコンスタントメモリはまったく同じであり、同じタイプの最適化を提供します。つまり、nVidiaGPUを使用する場合です。ATI GPUでは、同様に動作する必要があります。そして、CPUで実行した場合、コンスタントメモリがグローバルよりも優れているとは思えません。

于 2012-05-02T12:04:40.010 に答える