我有一個浮點數組,需要在設備上多次引用,所以我相信存儲它的最佳位置是__常量__內存(使用this reference)。在初始化時,數組(或向量)需要在運行時寫入一次,但是通過多次不同的函數讀取數百萬次,因此每次函數調用時不斷向內核複製就像是一個糟糕的想法。thrust :: device_vector在常量內存中
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),但也應聲在運行時間,將是全球__ __內存,而不是__ constant__內存
這都可以如果我只是放棄推力庫,那麼可以開始工作,但是有沒有辦法使用帶有全局變量和設備常量內存的推力庫?
感謝您的幫助!向量將是2個元素的長度,可能> = 8096,所以我會放棄使用__ constant __的想法memory – user2462730
如果我更改爲全局device_vector並引用它,我在運行時崩潰(好吧,調試運行時間)我可以添加一個全局device_vector還是需要在main()中聲明並通過引用傳遞? – user2462730
2或者size的大小並不是不在這裏使用'__constant__'的原因 - 正如我所說的:你的並不是'__constant__'優化的內存訪問模式的類型。關於你的崩潰:爲什麼要把它變成全球?我將它看作全局性的問題是,您將無法創建在運行時確定大小的數組,因爲構造函數將在main()之前調用。在編譯單元中構建全局變量的順序也有棘手的問題。通常我會在一個函數中創建它並通過引用傳遞它。 – harrism