私はCUDAが新しく、2d配列をカーネルに渡す方法を理解しようとしています。 私は1次元配列のために、次の作業のコードを持っている:私はすべてが正常に動作しますが、私は次のように2次元配列で仕事をしたい、言ったようにC#managedCuda 2dアレイからGPUへ
__global__ void DoubleIt(const float* A, float* C, int N)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < N)
C[i] = A[i] * 2;
}
次のカーネルコードと
class Program
{
static void Main(string[] args)
{
int N = 10;
int deviceID = 0;
CudaContext ctx = new CudaContext(deviceID);
CudaKernel kernel = ctx.LoadKernel(@"doubleIt.ptx", "DoubleIt");
kernel.GridDimensions = (N + 255)/256;
kernel.BlockDimensions = Math.Min(N,256);
// Allocate input vectors h_A in host memory
float[] h_A = new float[N];
// Initialize input vectors h_A
for (int i = 0; i < N; i++)
{
h_A[i] = i;
}
// Allocate vectors in device memory and copy vectors from host memory to device memory
CudaDeviceVariable<float> d_A = h_A;
CudaDeviceVariable<float> d_C = new CudaDeviceVariable<float>(N);
// Invoke kernel
kernel.Run(d_A.DevicePointer, d_C.DevicePointer, N);
// Copy result from device memory to host memory
float[] h_C = d_C;
// h_C contains the result in host memory
}
}
私は
kernel.BlockDimensionsが1 DIMENとして滞在しなければならないので、同じスレッド上にあるように、すべての第二の寸法を必要とする
// Allocate input vectors h_A in host memory
int W = 10;
float[][] h_A = new float[N][];
// Initialize input vectors h_A
for (int i = 0; i < N; i++)
{
h_A[i] = new float[W];
for (int j = 0; j < W; j++)
{
h_A[i][j] = i*W+j;
}
}
各カーネルスレッドは10要素で1d配列を取得する必要があります。
私の下の質問は次のようなものです:この2次元配列をデバイスにコピーしてカーネルでどのように使用するのですか? (この例では合計10個のスレッドが必要です)。
私は数年前からCudafyで働いていて、同じ問題があります。私の知る限り(私は間違っている可能性があります)、Jagged Arraysをサポートする現在管理されているCudaCトランスはありません。彼らはポインタを正しく処理しません。私が慣れていないマネージド・クーダは、それを別々に扱うかもしれません。 Cudafyを使うと、独自のCuda Cを作成して読み込むことができます。割り当て問題を理解するには、次のようにしてください:https://stackoverflow.com/questions/1047369/allocate-2d-array-on-device-memory-in-cuda –
私はこの会話を以前に見ましたが、実際にそれを理解しませんでした。 ..'cudaMemcpy2D()'について何か言いますが、コードには実装されていません。とにかく私のコードはC#で書かれているので、私はそこに書かれたすべてのプログラムをC#で解決したいと思っています。私はthrereがc/C++のソリューションだと知っていますが、それは本当に私を助けてくれないし、managedCudaに翻訳することができませんでした。どんな手がかりも役に立つでしょう。 – TVC