在CUDAC项目中使用推力::max_元素

在CUDAC项目中使用推力::max_元素,cuda,max,thrust,Cuda,Max,Thrust,在CUDAC项目中,我想尝试使用推力库来查找浮点数组中的最大元素。我需要的似乎是推力函数推力::max_element()。我想在其上使用此函数的数组是cuda内核的结果(似乎工作正常),因此在调用推力::max_element()时,它已经存在于设备内存中。 我对推力库不是很熟悉,但在查看了推力::max_element()的文档并阅读了该站点上类似问题的答案后,我认为我已经掌握了该过程的工作原理。不幸的是,我得到了错误的结果,似乎我没有正确使用库函数。谁能告诉我我的密码有什么问题吗 floa

在CUDAC项目中,我想尝试使用推力库来查找浮点数组中的最大元素。我需要的似乎是推力函数推力::max_element()。我想在其上使用此函数的数组是cuda内核的结果(似乎工作正常),因此在调用推力::max_element()时,它已经存在于设备内存中。 我对推力库不是很熟悉,但在查看了推力::max_element()的文档并阅读了该站点上类似问题的答案后,我认为我已经掌握了该过程的工作原理。不幸的是,我得到了错误的结果,似乎我没有正确使用库函数。谁能告诉我我的密码有什么问题吗

float* deviceArray;
float* max;
int length = 1025;

*max = 0.0f;
size = (int) length*sizeof(float);     

cudaMalloc(&deviceArray, size);
cudaMemset(deviceArray, 0.0f, size);

// here I launch a cuda kernel which modifies deviceArray

thrust::device_ptr<float> d_ptr = thrust::device_pointer_cast(deviceArray);
*max = *(thrust::max_element(d_ptr, d_ptr + length));
float*设备阵列;
浮动*最大值;
整数长度=1025;
*最大值=0.0f;
大小=(int)长度*sizeof(float);
Cudamaloc(设备阵列和尺寸);
cudaMemset(设备阵列,0.0f,大小);
//在这里,我启动了一个cuda内核,它修改了deviceArray
推力::设备\u ptr d\u ptr=推力::设备\u指针\u转换(设备阵列);
*max=*(推力:max_元素(d_ptr,d_ptr+长度));
我使用以下标题:

#include <thrust/extrema.h>
#include <thrust/device_ptr.h>
#包括
#包括
即使我确信deviceArray在运行内核后包含非零值,我还是会一直为*max获取零值。 我使用nvcc作为编译器(CUDA 7.0),并在具有3.5计算能力的设备上运行代码


任何帮助都将不胜感激。谢谢。

这不是正确的C代码:

float* max;
int length = 1025;

*max = 0.0f;
在正确提供指针的分配(并将指针设置为该分配的地址)之前,不允许使用指针(
max
)存储数据

除此之外,您的代码的其余部分似乎也适用于我:

$ cat t990.cu
#include <thrust/extrema.h>
#include <thrust/device_ptr.h>
#include <iostream>


int main(){

  float* deviceArray;
  float max, test;
  int length = 1025;

  max = 0.0f;
  test = 2.5f;
  int size = (int) length*sizeof(float);

  cudaMalloc(&deviceArray, size);
  cudaMemset(deviceArray, 0.0f, size);
  cudaMemcpy(deviceArray, &test, sizeof(float),cudaMemcpyHostToDevice);

  thrust::device_ptr<float> d_ptr = thrust::device_pointer_cast(deviceArray);
  max = *(thrust::max_element(d_ptr, d_ptr + length));
  std::cout << max << std::endl;
}
$ nvcc -o t990 t990.cu
$ ./t990
2.5
$
$cat t990.cu
#包括
#包括
#包括
int main(){
浮动*设备阵列;
浮动最大值,测试;
整数长度=1025;
最大值=0.0f;
试验=2.5f;
int size=(int)长度*sizeof(float);
Cudamaloc(设备阵列和尺寸);
cudaMemset(设备阵列,0.0f,大小);
cudaMemcpy(设备阵列和测试、大小(浮动)、CUDAMEMCPYHOSTTO设备);
推力::设备\u ptr d\u ptr=推力::设备\u指针\u转换(设备阵列);
max=*(推力:max_元素(d_ptr,d_ptr+长度));

std::谢谢你的回答。是的,很抱歉变量声明部分的C代码不正确,我没有考虑太多就写了。正如你可能想象的那样,我在这里报告的代码是一个更大脚本的一部分,开始时错误的部分是试图合成一些不同的东西,但我想写一些完整的代码不幸的是,我做得太匆忙了。无论如何,再次感谢您向我展示了这个工作代码:那么,我必须假设这个bug在其他地方。