デバイスで何度も参照する必要がある float 配列があるため、格納するのに最適な場所は __ 定数 __ メモリ (この参照を使用) であると考えています。配列 (またはベクトル) は、初期化時に実行時に 1 回書き込む必要がありますが、複数の異なる関数によって何百万回も読み取られるため、関数呼び出しごとにカーネルに定数をコピーすることは悪い考えのように思えます。
const int n = 32;
__constant__ float dev_x[n]; //the array in question
struct struct_max : public thrust::unary_function<float,float> {
float C;
struct_max(float _C) : C(_C) {}
__host__ __device__ float operator()(const float& x) const { return fmax(x,C);}
};
void foo(const thrust::host_vector<float> &, const float &);
int main() {
thrust::host_vector<float> x(n);
//magic happens populate x
cudaMemcpyToSymbol(dev_x,x.data(),n*sizeof(float));
foo(x,0.0);
return(0);
}
void foo(const thrust::host_vector<float> &input_host_x, const float &x0) {
thrust::device_vector<float> dev_sol(n);
thrust::host_vector<float> host_sol(n);
//this method works fine, but the memory transfer is unacceptable
thrust::device_vector<float> input_dev_vec(n);
input_dev_vec = input_host_x; //I want to avoid this
thrust::transform(input_dev_vec.begin(),input_dev_vec.end(),dev_sol.begin(),struct_max(x0));
host_sol = dev_sol; //this memory transfer for debugging
//this method compiles fine, but crashes at runtime
thrust::device_ptr<float> dev_ptr = thrust::device_pointer_cast(dev_x);
thrust::transform(dev_ptr,dev_ptr+n,dev_sol.begin(),struct_max(x0));
host_sol = dev_sol; //this line crashes
}
グローバル推力::device_vector dev_x(n)を追加しようとしましたが、それも実行時にクラッシュし、__定数__メモリではなく__グローバル__メモリになります
スラスト ライブラリを破棄するだけで、これをすべて機能させることができますが、スラスト ライブラリをグローバルとデバイス定数メモリで使用する方法はありますか?