0

ホスト側のコードで使用するグローバル定数データが​​あるとします。

const float my_array[20] = { 45.146, 54.633, 74.669, 12.734, 74.240, 100.524 };

(注:私はそれらをC風に保ちました。ここではありませんconstexpr。)

これらをデバイス側のコードでも使用したいと考えています。単純に使い始めることはできません。デバイスから直接アクセスすることはできず、使用しようとすると次のようになります。

error: identifier "my_array" is undefined in device code 

このような定数をホストとデバイスの両方で使用できるようにする慣用的な方法は何ですか?

4

1 に答える 1

1

このアプローチは、2012 年の回答でMark Harris によって提案されました。

#define MY_ARRAY_VALUES 45.146, 54.633, 74.669, 12.734, 74.240, 100.524
__constant__ float device_side_my_array[2] = { MY_ARRAY_VALUES };
const        float host_side_my_array[2]   = { MY_ARRAY_VALUES };
#undef MY_ARRAY_VALUES

__device__ __host__ float my_array(size_t i) {
#ifdef __CUDA_ARCH__
    return device_side_my_array[i];
#else
    return host_side_my_array[i];
#endif
}

ただし、これにはいくつかの欠点があります。

  • 実際には同じ定数を使用するのではなく、同じ値を持つ定数のみを使用します。
  • データの複製。
  • かなり限られたリソースである一定のメモリを占有します。
  • 少し冗長に思えます (ただし、他のオプションはさらに詳細な場合があります)。

これは、ほとんどの人が実際に使用しているものなのだろうか。

ノート:

  • C++ では、名前空間内の異なるサブ名前空間で同じ名前を使用する場合がありdetail::ます。
  • 使用しませんcudaMemcpyToSymbol()
于 2021-08-18T12:54:23.427 に答える