私は C# で ManagedCuda を使用していますが、答えが見つからない質問が 1 つあります。C++ と CUDA では、次のような変数 (配列) を宣言できることを読んでいました。
__constant__ double myVar[X];
(これは X 要素の配列を保持すると想定されます)
後でこれを使用して、ホスト コードから値を設定します。
cudaMemcpyToSymbol(myVar, &arrayFromHost[0], sizeof(arrayFromHost) * numElements,
size_t(0),cudaMemcpyHostToDevice);
したがって、次のようなものを使用できます。
__global__ void myFunction(double *res)
{
*res = myVar[0] + 2.5;
}
myVar
ホストから設定された値を使用して...
しかし、ManagedCudaではそれができないようです...どうすればできますか??
- *.cu ファイルで定数変数を宣言する
- *.cs ファイルの値 (配列) をその定数に設定します
- 定数 1 の値を使用します。同じ *.cu ファイル内の関数で
(または__device__
変数...わかりません...最初に実行されたときに(要素数が不明な)配列を受け取る変数になり、それ以降、関数はその変数を参照します値ですが、その変数は変更されません)
今は aCudaDeviceVariable
を宣言するだけで二度と触れませんが、カーネルでは常に DevicePointer を送信する必要があるため、読むときに理解しにくいと思います...
現在、次のようになっています。
myKernel.Run(staticData.DevicePointer, moreData.DevicePointer,
evenMoreData.DevicePointer, numberOfElementsWhichNeverChange,
moreStaticData.DevicePointer, myResults.DevicePointer)
変更されないデータを持つ 3 つのパラメーターをスキップしてsetData.Run(numElements, staticData, moreStaticData);
、*.cu ファイル内の他の関数の定数またはデバイス変数から使用するような別の関数に設定したいと思います。