带有原始指针的max_element索引

时间:2014-06-04 11:35:36

标签: c++ cuda thrust

我一直在看Thrust,我偶然发现了一个几乎(但不完全)回答我的问题:Finding the maximum element value AND its position using CUDA Thrust

在答案中发布的示例工作正常,但如何使用原始指针做同样的事情?让我们假设这个代码我认为是正确的(忽略内核配置,为了简单起见):

float* d_A;
const unsigned int noElems = 10;
cudaMalloc(&d_A, noElems * sizeof(float));
initDeviceVector<<<1, noElems>>>(d_A);

thrust::device_ptr<float> d_ptr = thrust::device_pointer_cast(d_A);     
thrust::device_vector<float>::iterator iter = 
    thrust::max_element(d_ptr, d_ptr + noElems);

我无法弄清楚如何使用 iter 和原始指针来提取位置。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

可能有很多方法可以做到这一点。不过直接从您的代码开始工作,如果我们首先将其转换为合适的设备指针,我们可以将iter的值与device_ptr进行比较。

以下完全有效的例子证明了这一点:

$ cat t436.cu
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/extrema.h>
#include <stdio.h>


__global__ void initDeviceVector(float *data){
  int idx = threadIdx.x+blockDim.x*blockIdx.x;
  data[idx] = idx%7;
}

  int main(){

  float* d_A;
  const unsigned int noElems = 10;
  cudaMalloc(&d_A, noElems * sizeof(float));
  initDeviceVector<<<1, noElems>>>(d_A);

  thrust::device_ptr<float> d_ptr = thrust::device_pointer_cast(d_A);
  thrust::device_vector<float>::iterator iter = thrust::max_element(d_ptr, d_ptr + noElems);

  int pos = thrust::device_pointer_cast(&(iter[0])) - d_ptr;

  printf("pos = %d\n", pos);
  return 0;
}

$ nvcc -arch=sm_20 -o t436 t436.cu
$ ./t436
pos = 6
$