2016-10-25 16 views
1

今日、私はC#アプリケーションからCUDA C/C++プログラムを起動しようとしています。ManagedCUDA:構造体パラメータをカーネルに渡す

私はウェブ上でいくつかの調査をしましたが、それほど多くの情報は見つかりませんでした。私は唯一の "GitHubのを" 見たが、無...

は、だから私は、カーネルは次のように定義されたガット: (それは例です)

__global__ void kernel(Cartesian a, Cartesian b, Cartesian *c) 

を "デカルト" では:

class Cartesian 
{ 
public: 
    double x; 
    double y; 
    double z; 
}; 

私はmanagedCUDAから私が理解しているものを使用します。これは、CUDA C/C++プログラムの主な機能を置き換えるようなものです。 「私たちのために仕事をする」というのlibを使用して

は、だから私は、このページから例を追っ:

https://algoslaves.wordpress.com/2013/08/25/nvidia-cuda-hello-world-in-managed-c-and-f-with-use-of-managedcuda/

そして、このように私のC#のプログラムを書く:

作成部分をコンテキスト:(いけない本当にこの「概念」を取得)打ち上げ(私は推測する)こと

static void InitKernels() 
    { 
     CudaContext cntxt = new CudaContext(); 
     CUmodule cumodule = cntxt.LoadModule(@"C:\Users\stage\Documents\Visual Studio 2013\Projects\Cs_link_test\Cs_link_test\x64\Release\kernel.ptx"); 
     addWithCuda = new CudaKernel("kernel", cumodule, cntxt); 
    } 

一部の機能をし、KEによって行われた変更を取り戻しますrnel:私は(ちょうど言う)のC#

だから、私の問題に精通していないよ

static Func<Cartesian, Cartesian, Cartesian> cudaAdd = (a, b) =>

static Func<Cartesian, Cartesian, Cartesian> cudaAdd = (a, b) => 
    { 
     CudaDeviceVariable<Cartesian> result_dev; 
     Cartesian result_host; 
     addWithCuda.Run(a, b, result_dev.DevicePointer); 
     result_dev.CopyToHost(ref result_host); 
     return result_host; 
    }; 

そして、この部分から、私はラインから何かを理解していない

result_devとresult_hostによって引き起こされるエラーから来ます。

エラー言う:未割り当てのローカル変数の

使用 'result_は、*'

彼らは初期化さarren'tのでだから、それはありますか?

もしそうなら、なぜresult_hostがエラーを起こすのですか?それはカーネルによって変更される必要があるresult_devからデータを取得する必要があります。

もしそうでなければ、これを修正するには?

また、カーネル関数を使ってClassパラメータを調べることも可能ですか?もしそうなら、CudaDeviceVariableをどのように設定するのですか。なぜなら、その型はnull不可能でなければならないからです。だから私は構造体を使ってクラスを変更するのです。

+0

質問は不明です。 C/C++ CUDAコードまたはC#managedCUDAを記述しようとしていますか? – Aznaveh

+0

CUDA C/C++コードはすでに記述されています。私はこのCUDA C/C++コードを実行するためにC#managedCUDAをコード化しようとしています –

答えて

0

わかりました。私はちょうど私の問題を解決する方法を考え出しました。 https://managedcuda.codeplex.com/discussions/659183の「ディスカッション」セクションを読んでください。では、managedCUDAを使って構造体パラメータをカーネルに渡す方法は?

私が間違っていた最初のことは、Func<T, T, T>の部分を使用することです。 あなたはあなたのクラスを宣言しなければなりません。フォローのような立方ファイル:あなたは.csで

class Cartesian 
{ 
public: 
    double x; 
    double y; 
    double z; 
} 

と同じことが、フォローのようなファイル:あなたが望むよう次に、あなたがあなたのカーネルを初期化することができ

[StructLayout(LayoutKind.Sequential)] 
struct Cartesian 
{ 
    public double x; 
    public double y; 
    public double z; 
    public Cartesian(double x, double y, double z) { this.x = x; this.y = y; this.z = z; } 
}; 

、私はこのようにそれを行う:

static void InitKernels() 
    { 
     CudaContext ctx = new CudaContext(); 
     CUmodule cumodule = ctx.LoadModule(@"C:\Users\stage\Documents\Visual Studio 2013\Projects\Cs_link_test\Cs_link_test\x64\Release\kernel.ptx"); 
     kernel = new CudaKernel("kernelPosGeo", cumodule, ctx); 
     kernel.BlockDimensions = 1024; 
     kernel.GridDimensions = 614; 
    } 

あなたがしなければならないことは、必要なパラメータでカーネルを呼び出すだけです。

Cartesian a = new Cartesian(1, 2, 3); 
kernel.Run(a); 

は私がFunc<T, T,T>を使用するので、私は問題を抱えていたが、私はもうそれを使用していないまで、それが簡単に思えると思います。そして、Funcの宣言は、最大で2つのパラメータと1つのパラメータを有していた。だから私は4つまたは5つのパラメータを持つカーネルを持っていると私はここに限られていた...しかし、今は、問題はありません。

関連する問題