Использование thrust::max_element в проекте CUDA C

В проекте CUDA C я хотел бы попробовать использовать библиотеку Thrust, чтобы найти максимальный элемент в массиве с плавающей точкой. Кажется, мне нужна функция Thrust thrust::max_element(). Массив, в котором я хочу использовать эту функцию, является результатом ядра cuda (которое, кажется, работает нормально), и поэтому он уже присутствует в памяти устройства при вызове thrust::max_element(). Я не очень знаком с библиотекой Thrust, но, посмотрев документацию по thrust::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));

Я использую следующие заголовки:

#include <thrust/extrema.h>
#include <thrust/device_ptr.h>

Я продолжаю получать нулевые значения для * max, хотя я уверен, что deviceArray содержит ненулевые значения после запуска ядра. Я использую nvcc в качестве компилятора (CUDA 7.0) и запускаю код на устройстве с возможностью вычислений 3.5.

Любая помощь приветствуется. Благодарю.

1 ответ

Это не правильный код 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
$
Другие вопросы по тегам