我一直在看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 和原始指针来提取位置。
感谢您的时间。
答案 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
$