我想找到使用gpu的数组的最小值因此我想使用thrust :: min_element我的数据在设备中这就是为什么我必须使用thrust :: device但我有一个"从位置0x0000000701240000读取访问冲突"我正在考虑tuple.inl功能:
inline __host__ __device__
cons( T1& t1, T2& t2, T3& t3, T4& t4, T5& t5,
T6& t6, T7& t7, T8& t8, T9& t9, T10& t10 )
但如果我使用推力::主机它的工作原理!这是我的代码。如果有什么问题请告诉我。
#include <thrust/extrema.h>
#include <thrust/execution_policy.h>
#include <time.h>
int main()
{
int nx=200;
int ny=200;
float cpt=0;
clock_t start,end;
double time;
float *in,*d_in;
float moy,*d_moy;
in=(float*)malloc(nx*ny*sizeof(float));
moy=0.0f;
cudaMalloc((void**)&d_in,nx*ny*sizeof(float));
cudaMalloc((void**)&d_moy,sizeof(float));
for(int i=0;i<nx*ny;i++){in[i]=i+0.07;cpt+=in[i];}
cudaMemcpy(d_in,in,nx*ny*sizeof(float),cudaMemcpyHostToDevice);
start=clock();
//float result= thrust::reduce(thrust::device, d_in, d_in + nx*ny);
float *result=thrust::min_element(thrust::device, d_in , d_in+ nx*ny);
end=clock();
time=((double)(end-start))/CLOCKS_PER_SEC;
printf("result= %f and correct result is %f time= %lf \n",*result,in[0],time);
system("pause");
}
答案 0 :(得分:1)
这是thrust::min_element
的错误。使用原始指针时程序崩溃。此错误仅存在于CUDA7.5 Thrust1.8.2或更早版本中。
您可以改用thrust::device_vector
或thrust::device_ptr
。这是使用推力的更好方法。
#include <iostream>
#include <thrust/sequence.h>
#include <thrust/extrema.h>
#include <thrust/device_vector.h>
#include <thrust/execution_policy.h>
int main() {
int n = 1000;
thrust::device_vector<float> in(n);
thrust::sequence(in.begin(), in.end(), 123);
std::cerr << "by iterator:" << std::endl;
thrust::device_vector<float>::iterator it_result =
thrust::min_element(in.begin(), in.end());
std::cerr << *it_result << std::endl;
std::cerr << "by device_ptr:" << std::endl;
thrust::device_ptr<float> ptr_in = in.data();
thrust::device_ptr<float> ptr_result =
thrust::min_element(ptr_in, ptr_in + in.size());
std::cerr << *ptr_result << std::endl;
std::cerr << "by pointer:" << std::endl;
float* raw_in = thrust::raw_pointer_cast(in.data());
std::cerr << "before min_element" << std::endl;
float* result = thrust::min_element(thrust::device, raw_in, raw_in + in.size());
std::cerr << "after min_element" << std::endl;
std::cerr << in[result - raw_in] << std::endl;
return 0;
}
结果表明thrust::min_element
与原始指针崩溃。
$ nvcc -o test test.cu && ./test
by iterator:
123
by device_ptr:
123
by pointer:
before min_element
Segmentation fault (core dumped)
另一方面,如果此错误不存在,您的原始代码仍有问题。正如@talonmies所说,result
是设备指针。在打印之前,您需要将设备指向的数据从设备复制到主机。