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;
}
は、ネストされた、この種の構造をサポートして推力のでしょうか?または私のアルゴリズムを再設計する必要がある以外の方法はありませんか?並列化が困難なアルゴリズムが存在しますか?
ありがとうございます!
@Mr。ロバート、ありがとう!わたしにはできる。私はこのスニペットが私のアプリケーションを開発するために必要です。そして、それは私がすべての文書を見ても、それがうまくいくかどうかわからないというのは本当に大きな挑戦です –