我目前正在尝试使用推力::: upper_bound函数。我正在为函数提供的参数遇到问题。我想利用CUDA向量类型,尤其是.txt
,但是当我使用这种类型时,会遇到一些推力库错误。
我正在运行的代码块如下:
filename.txt.txt
显示的错误消息如下:
double3
我想知道推力是否支持CUDA向量类型的使用,或者我只是做错了什么。
答案 0 :(得分:1)
您需要满足推力算法的所有预期输入类型。您没有这样做,因为您定义的几乎每个数量都不符合预期的推力。
对于初学者,我们将需要实际的迭代器。在设备代码中,这意味着指针。推力需要能够取消对迭代器/指针的引用,然后您必须指示推力如何处理该数量。为此,我们需要一个适当定义的函子。您不妨阅读thrust quick start guide来了解函子的定义和用法。最后,这里的明智的指针/迭代器是指double3
类型,因此我们将需要制作几乎所有与double3
一起使用的东西。请注意,我们需要选择upper_bound
中的the version,以便定义我们自己的自定义函子,以便我们可以操纵double3
的数量(取消引用迭代器/指针时得到的结果) )。
这可能有帮助:
#include <thrust/binary_search.h>
#include <thrust/execution_policy.h>
struct my_comp_functor{
template <typename T>
__host__ __device__
bool operator()(T &t1, T &t2) {
return (t1.y < t2.y);}
};
__global__ void eos_search_gpu(const double3* y, const int my,
const double3* x, const int n,
const int dim_x, int * j, my_comp_functor my_comp){
int i = threadIdx.x + blockDim.x * blockIdx.x;
if ( i < my) {
const double3 *ptr = thrust::upper_bound(thrust::seq, x, x+n, y[i], my_comp);
j[i] = (ptr[0].y - x[i].y - 1);
}
}
int main(){
double3 *d_y, *d_x;
int *d_j;
cudaMalloc(&d_y, 1024);
cudaMalloc(&d_x, 1024);
cudaMalloc(&d_j, 1024);
struct my_comp_functor my_obj;
eos_search_gpu<<<1,1>>>(d_y, 0, d_x, 0, 0, d_j, my_obj);
cudaDeviceSynchronize();
}
(上面的代码对我来说在CUDA 9.2上编译时没有编译错误,但显然不是为了功能/有用而设计的)
最后,对我来说,您似乎在将double
数量塞入j[i]
(一个整数)中,但却是您的代码,这很奇怪。
此外,我可能在该函子中的排序有误,因此可能需要将<
更改为>
。
当您调用该内核时,请注意我添加了一个参数;您需要在主机代码中实例化一个my_comp_functor
对象,然后将其传递到适当位置的内核。
最后,您似乎正在执行向量化搜索,请注意,推力具有vectorized searches available,可能不需要此内核。