gpt4 book ai didi

c++ - 带有原始指针的 max_element 的索引

转载 作者:行者123 更新时间:2023-11-28 02:47:06 25 4
gpt4 key购买 nike

我一直在看推力,我偶然发现了一个几乎(但不完全)回答我的问题: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 和原始指针提取位置。

感谢您的宝贵时间。

最佳答案

可能有多种方法可以做到这一点。但是,如果我们先将 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
$

关于c++ - 带有原始指针的 max_element 的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24036339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com