Cuda向量类型的推力支持

时间:2018-07-10 22:27:14

标签: compiler-errors cuda thrust

我目前正在尝试使用推力::: upper_bound函数。我正在为函数提供的参数遇到问题。我想利用CUDA向量类型,尤其是.txt,但是当我使用这种类型时,会遇到一些推力库错误。

我正在运行的代码块如下:

filename.txt.txt

显示的错误消息如下:

double3

我想知道推力是否支持CUDA向量类型的使用,或者我只是做错了什么。

1 个答案:

答案 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,可能不需要此内核。