6

シミュレーション パラメータを定数メモリに設定しようとしていますが、うまくいきません (CUDA.NET)。cudaMemcpyToSymbol 関数は cudaErrorInvalidSymbol を返します。cudaMemcpyToSymbol の最初のパラメーターは文字列です... シンボル名ですか? 実際、どのように解決できるかわかりません。どんな助けでも感謝します。

//init, load .cubin   
float[] arr = new float[1];
    arr[0] = 0.0f;
    int size = Marshal.SizeOf(arr[0]) * arr.Length;
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.Copy(arr, 0, ptr, arr.Length);
    var error = CUDARuntime.cudaMemcpyToSymbol("param", ptr, 4, 0, cudaMemcpyKind.cudaMemcpyHostToDevice);

私の.cuファイルが含まれています

__constant__ float param;

ワーキングソリューション

     cuda.LoadModule(Path.Combine(Environment.CurrentDirectory, "name.cubin"));            
 simParams = cuda.GetModuleGlobal("params");
 float[] parameters = new float[N]{...}             
 cuda.CopyHostToDevice<float>(simParams, parameters);
4

3 に答える 3

4

残念ながら、__定数__はシンボルのmemcpyと同じファイルスコープにある必要があり、あなたの場合、__定数__は別の.cuファイルにあります。

これを回避する簡単な方法は、.cuファイルにラッパー関数を提供することです。次に例を示します。

__constant__ float param;

// Host function to set the constant
void setParam(float value)
{
  cudaMemcpyToSymbol("param", ptr, 4, 0, cudaMemcpyHostToDevice);
}

// etc.
__global__ void ...
于 2010-03-16T08:00:09.883 に答える
2

この質問が実際の場合は、次のようにcuModuleGetGlobalと次のcudaMemcpyを使用できます。

private bool setValueToSymbol(CUmodule module, string symbol, int value)
{
    CUdeviceptr devPtr = new CUdeviceptr();
    uint lenBytes = 0;
    CUResult result = CUDADriver.cuModuleGetGlobal(ref devPtr, ref lenBytes, module, symbol);
    if (result == CUResult.Success)
    {
        int[] src = new int[] { value };
        cudaError error = CUDARuntime.cudaMemcpy(devPtr, src, lenBytes, cudaMemcpyKind.cudaMemcpyHostToDevice);
        if (error == cudaError.cudaSuccess)
            return true;
        else
            return false;
    }
    else
    {
        return false;
    }
}

where CUmodule module = cuda.LoadModule("MyCode.cubin"); このコードは、NVIDIA GPU Computing SDK 3.1 および CUDA.NET 3.0 で動作します。

于 2011-01-14T06:59:03.243 に答える
1

定数メモリには、暗黙的なローカル スコープ リンクがあります。宣言が、それを使用するのと同じファイルにあることを確認してください。2つのファイルがあるようです。param配列に宣言する必要があるかもしれません(またはそうでないかもしれません)

于 2010-03-16T01:26:13.053 に答える