ホスト メモリからデバイス メモリに 3 次元配列をコピーする方法を知りたいです。データを含む 3 次元配列があるとします。たとえば、int host_data[256][256][256]; そのデータを dev_data (デバイス配列) にそのような方法でコピーしたいので、host_data[x][y][z]=dev_data[x][y][z]; どうすればできますか?また、デバイスの dev_data 配列にアクセスするにはどうすればよいですか? 簡単な例は非常に役に立ちます。
4794 次
2 に答える
5
一般的な方法は、配列をフラット化する (1 次元にする) ことです。(x,y,z)
次に、トリプルから 1 つの数値 (平坦化された 1 次元配列内の位置) にマップするための計算を行う必要があります。
例 2D:
int data[256][256];
int *flattened = data;
data[x][y] == fattened[x * 256 + y];
3D の例:
int data[256][256][256];
int *flattened = data;
data[x][y][z] == flattened[x * 256 * 256 + y * 256 + z];
またはラッパーを使用します。
__host__ __device___ inline int index(const int x, const int y, const int z) {
return x * 256 * 256 + y * 256 + z;
}
これを知っていれば、通常どおり cudaMalloc を使用して線形配列を割り当て、index
関数を使用してデバイス コード内の対応する要素にアクセスできます。
更新:この質問 の著者は、(少なくとも 2D では) より良い解決策を見つけたと主張しています。
于 2013-04-03T22:24:10.700 に答える