0
如以下代碼所示,我創建了一個大向量X,並通過cpy_cpy運算符將其內容複製到Y.它運行正常,X的長度小於65536,但是當X比這個更長時,會崩潰。錯誤信息是:同步:launch_closure_by_value:遇到非法內存訪問
synchronize: launch_closure_by_value: an illegal memory access was encountered.
我在Nvidia GTX 680卡上使用CUDA v6.0。
任何人都可以幫助我嗎?非常感謝!
const int num = 256*512; //256*512 crashes but 128*512 is okay!
uchar3* x_raw_ptr, y_raw_ptr;
cudaMalloc((void **) &x_raw_ptr, num * sizeof(uchar3));
cudaMalloc((void **) &y_raw_ptr, num * sizeof(uchar3));
thrust::device_ptr<uchar3> X_p(x_raw_ptr);
thrust::device_ptr<uchar3> Y_p(y_raw_ptr);
thrust::transform(X_p, X_p + num*sizeof(uchar3), thrust::make_counting_iterator(0), Y_p, cpy_cpy);
爲什麼不使用'X.begin()'和'X.end()'直接從矢量獲取迭代器?使用'device_ptr'服務有什麼可能的目的(除了像在這裏所做的那樣容易犯錯)? – talonmies
那麼,我正在學習如何使用device_ptr以及如何將device_ptr傳遞給transform()。在我的項目中,設備內存由opencv cuda :: GpuMat矩陣分配,而不是由device_vector分配。在這裏,我只是使用device_vector爲device_ptr分配一些內存。我注意到device_vector :: begin()device_vector :: end()總是工作。 –
感謝talonmies,爲了避免混淆他人,我更新了我的帖子。 –