私は推力:: raw_pointer_castを使用して生ポインタをキャスターでキャッチしようとしています。私はfloatへのポインタを渡す複数のアプローチを試みましたが、メモリの競合と2つのintellisenseエラーが発生し続けます:: system :: cuda :: thrustにはメンバ "system_error"がなく、メンバ "cuda_category"もありません。奇妙なことは、特にBULKを参照していないにもかかわらず、BULKライブラリの一部であると思われるプログラムthrow_on_error.hppのエラーと思われることです。私はC++を初めて使っているので、ポインタを誤解している可能性があります。あるいは、ある種のインクルードがありません。"system_error"と "cuda_category"に特別に名前空間の推論:: system :: cuda ::推力
以下は、動作させようとしているコードのバージョンです。どんな助けでも大歓迎です。
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/sort.h>
#include <thrust/execution_policy.h>
#include <thrust/for_each.h>
#include <thrust/sequence.h>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <algorithm>
#include <memory.h>
#include <cstdio>
#include <thread>
#include <thrust/copy.h>
#include <thrust/iterator/zip_iterator.h>
#include <thrust/reduce.h>
using namespace std;
const int num_segs = 1; // number of segments to sort
const int num_vals = 5; // number of values in each segment
template <typename T>
struct sort_vector
{
T *Ndata;
T *Ddata;
T *answer;
sort_vector(T *_Ndata, T *_Ddata, float *a) : Ndata(_Ndata), Ddata(_Ddata), answer(a) {};
__host__ __device__ void operator()(int idx)
{
thrust::sort(thrust::seq, Ndata + idx*num_vals, Ndata + ((idx + 1)*num_vals));
thrust::sort(thrust::seq, Ddata + idx*num_vals, Ddata + ((idx + 1)*num_vals));
*answer = thrust::reduce(thrust::device, Ddata + idx*num_vals, Ddata + ((idx + 1)*num_vals));
}
};
int main() {
thrust::device_vector<float> d_Ndata(num_segs*num_vals);
d_Ndata[0] = 30;
d_Ndata[1] = 5.5;
d_Ndata[2] = 60;
d_Ndata[3] = 21;
d_Ndata[4] = 2;
thrust::device_vector<float> d_Ddata(num_segs*num_vals);
d_Ddata[0] = 50;
d_Ddata[1] = 9.5;
d_Ddata[2] = 30;
d_Ddata[3] = 8.1;
d_Ddata[4] = 1;
cout << "original norm" << endl;
int f = 0;
while (f < num_segs*num_vals){
cout << d_Ndata[f] << endl;
f++;
}
cout << "original dut" << endl;
int g = 0;
while (g < num_segs*num_vals){
cout << d_Ddata[g] << endl;
g++;
}
thrust::device_vector<int> d_idxs(num_segs);
thrust::sequence(d_idxs.begin(), d_idxs.end());
float *answer = (float*)malloc(sizeof(float));
cudaStream_t s1;
cudaStreamCreate(&s1);
clock_t start;
double duration;
start = clock();
thrust::for_each(thrust::cuda::par.on(s1),
d_idxs.begin(),
d_idxs.end(), sort_vector<float>(thrust::raw_pointer_cast(d_Ndata.data()), thrust::raw_pointer_cast(d_Ddata.data()), thrust::raw_pointer_cast(answer)));
cudaStreamSynchronize(s1);
cout << "sum" << endl;
cout << answer << endl;
//free(answer);
cudaStreamDestroy(s1);
duration = (clock() - start)/(double)CLOCKS_PER_SEC;
cout << "time " << duration << endl;
cin.get();
return 0;
}
ありがとうございました!はい、並列プログラムを実装するためのツールを集めようとしています。何千ものウィンドウが同じプログラム(すでに書かれていますが、遅すぎてGPUのコンピューティング能力を最大限に引き出すことはありません)を実行します。はい、私は間違いなく、(まだこれをテストし始めていない)ファンクタのすべての出力を収集するために、回答ベクトルにある種のインデックスを実装することを考えました、それを指摘してくれてありがとう。 – gracie