简单排序使用推力不工作(simple sorting using thrust not workin

2019-10-20 16:30发布

我有一个推力CUDA程序作为

#include <stdio.h>
#include<iostream>
#include <cuda.h>
#include <thrust/sort.h>



// main routine that executes on the host
int main(void)
{
  int *a_h, *a_d;  // Pointer to host & device arrays
  const int N = 10;  // Number of elements in arrays
  size_t size = N * sizeof(int);
  a_h = (int *)malloc(size);        // Allocate array on host
  cudaMalloc((void **) &a_d, size);// Allocate array on device
  std::cout<<"enter the 10 numbers";
  // Initialize host array and copy it to CUDA device
  for (int i=0; i<N; i++) 
  {
      std::cin>>a_h[i];
  }
  for (int i=0; i<N; i++) printf("%d %d\n", i, a_h[i]);
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  thrust::sort(a_d, a_d + N);
  // Do calculation on device:

  cudaMemcpy(a_h, a_d, sizeof(int)*N, cudaMemcpyDeviceToHost);
  // Print results
  for (int i=0; i<N; i++) printf("%d %d\n", i, a_h[i]);
  // Cleanup
  free(a_h); cudaFree(a_d);
} 

但它没有运行,得到所需的输出。

我们是否应该使用在推力排序宿主载体和设备向量????

Answer 1:

对于设备的操作,你应该使用一个设备指针,或device_vector迭代器,而不是原始指针。 原始指针(即指向主机存储器)可以被用于在主机上操作。

所以,如果你修改代码如下:

#include <thrust/device_ptr.h>
...
thrust::device_ptr<int> t_a(a_d);  // add this line before the sort line
thrust::sort(t_a, t_a + N);        // modify your sort line

我相信它会为你工作。

您不妨读一读推力快速入门指南 。 特别注意到本节:

你可能不知道,当一个“原始”的指针作为参数传递给推力功能会发生什么。 像STL,推力允许这种用法,它会调度算法的主机路径。 如果有问题的指针,其实是一个指向设备的内存,那么你就需要使用推力:: device_ptr把它包在调用之前



文章来源: simple sorting using thrust not working
标签: cuda thrust