2014-07-06 29 views
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); 

回答

0

我自己找出錯誤的原因。

X_p + num*sizeof(uchar3) -> X_p + num 

然後,一切看起來都很好。 推力的例子在這裏: http://thrust.github.io/doc/group__transformations.html#gacbd546527729f24f27dc44e34a5b8f73

+1

爲什麼不使用'X.begin()'和'X.end()'直接從矢量獲取迭代器?使用'device_ptr'服務有什麼可能的目的(除了像在這裏所做的那樣容易犯錯)? – talonmies

+0

那麼,我正在學習如何使用device_ptr以及如何將device_ptr傳遞給transform()。在我的項目中,設備內存由opencv cuda :: GpuMat矩陣分配,而不是由device_vector分配。在這裏,我只是使用device_vector爲device_ptr分配一些內存。我注意到device_vector :: begin()device_vector :: end()總是工作。 –

+0

感謝talonmies,爲了避免混淆他人,我更新了我的帖子。 –