Использование 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
$