我在thrust :: transform_reduce中使用了一個函數中的thrust :: reduce。情況看起來像一個嵌套推力算法。編譯會成功,但它的錯誤運行:作爲跟隨在推力函子內調用推力算法
terminate called after throwing an instance of 'thrust::system::system_error'
what(): cudaEventSynchronize in future::wait: an illegal memory access was encountered
Aborted (core dumped)
代碼:
#include <thrust/inner_product.h>
#include <thrust/functional.h>
#include <thrust/device_vector.h>
#include <iostream>
#include <cmath>
#include <boost/concept_check.hpp>
struct aFuntor : public thrust::unary_function<int, int>
{
aFuntor(int* av__, int* bv__, const int& N__) : av_(av__), bv_(bv__), N_(N__) {};
__host__ __device__
int operator()(const int& idx)
{
thrust::device_ptr<int> av_dpt = thrust::device_pointer_cast(av_);
int res = thrust::reduce(av_dpt, av_dpt+N_);
return res;
}
int* av_;
int* bv_;
int N_;
};
int main(void)
{
int N = 5;
std::vector<int> av = {0,1,3,5};
std::vector<int> bv = {0,10,20,30};
thrust::device_vector<int> av_d(N);
thrust::device_vector<int> bv_d(N);
av_d = av; bv_d = bv;
// initial value of the reduction
int init=0;
// binary operations
thrust::plus<int> bin_op;
int res =
thrust::transform_reduce(thrust::counting_iterator<int>(0),
thrust::counting_iterator<int>(N-1),
aFuntor(thrust::raw_pointer_cast(av_d.data()),
thrust::raw_pointer_cast(bv_d.data()),
N),
init,
bin_op);
std::cout << "result is: " << res << std::endl;
return 0;
}
並刺破支撐這種嵌套結構的?或者除了重新設計我的算法之外沒有其他辦法嗎? AFAIK有難以揭示並行性的算法嗎?
預先感謝您!
@Mr。羅伯特,謝謝你!這個對我有用。我需要這個片段來開發我的應用程序。對我來說,瀏覽所有文檔並確定它是否會工作真的是一個很大的挑戰 –