JCuda - 多次元配列

ホーム 目次に戻る

JCuda の多次元配列はメモリポインタ配列へのポインタを順次与えることで実現します。そのための特別な変換が用意されています。


JCuda の多次元配列

多次元配列の例として、ここでは float 型の2次元配列を取り上げます。
float[][] input = new float[XSIZE][YSIZE];
Java では、2次元配列は1次元配列を並べたものとして扱うことができます。このとき、1次元配列の先頭ポインタは Pointer.to(input[i]) で与えられます。
2次元配列は1次元配列の配列として表現されることになります。

そこで、デバイスメモリとして、内部に Pointer 型を持つような配列 input1D を定義します。

CUdeviceptr[] input1D = new CUdeviceptr[XSIZE]();
IntStream.range(0, XSIZE).forEach(i->{
  input1D[i] = new CUdeviceptr();
  cuMemAlloc(input1D[i], YSIZE * Sizeof.FLOAT);
  cuMemcpyHtoD(input1D[i], Pointer.to(input[i]), YSIZE * Sizeof.FLOAT);
});
一番外側の配列は input1D へのポインタとして定義されます。
input1D[*] の型は Pointer 型となりますので、以下のように定義します。
CUdeviceptr deviceInput = new CUdeviceptr();
cuMemAlloc(deviceInput, XSIZE * Pointer.POINTER);
cuMemcpyHtoD(deviceInput, Pointer.to(input1D), XSIZE * Pointer.POINTER);
cuMemcpyHtoD() の第2引数に Pointer.to() をつけるのを忘れないでください。
.cu ファイルでは、2次元配列は。多重ポインタ float ** として表現されます。
順序は float input[XSIZE][YSIZE] となります。
Copyright (c) 2017-2019 by TeqStock.tokyo