【发布时间】:2025-12-11 06:35:01
【问题描述】:
我正在尝试在 CUDA 中进行独家减和。我正在使用 CUB 库并决定尝试 CUB::DeviceReduce。但是,我的结果是 NaN,我不知道为什么。
代码是:
#include <cub/cub.cuh>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using std::cout;
using std::endl;
#define DSIZE 512
void dev_cumsum( const float *dev_inData, float *dev_outData ) {
int n = 512;
void* dev_temp_storage = NULL;
size_t temp_storage_bytes = 0;
cub::DeviceScan::ExclusiveSum(dev_temp_storage,temp_storage_bytes,const_cast<float*>(dev_inData),dev_outData,n);
cudaMalloc(&dev_temp_storage,temp_storage_bytes);
cub::DeviceScan::ExclusiveSum(dev_temp_storage,temp_storage_bytes,const_cast<float*>(dev_inData),dev_outData,n);
}
int main(){
float h_data[512];
float* d_data;
float* d_result;
float h_result[512];
cudaMalloc(&d_data, DSIZE*sizeof(float));
cudaMalloc(&d_result, DSIZE*sizeof(float));
h_data[0] = rand()%10;
h_result[0] = 0;
for (int i=1; i<DSIZE; i++) {
h_data[i] = rand()%10;
h_result[i] = h_data[i-1]+h_result[i-1];
}
cudaMemcpy(d_data, h_data, DSIZE*sizeof(float), cudaMemcpyHostToDevice);
dev_cumsum(d_data, d_result);
printf("CPU result = %f\n", h_result[511]);
cudaMemcpy(h_result, d_result, DSIZE*sizeof(float), cudaMemcpyDeviceToHost);
printf("GPU result = %f\n", h_result[511]);
for( int i = 0; i < DSIZE; i++ ) {cout << h_result[i] << " ";}
cout << endl;
return 0;
}
此代码为设备结果的最后 8 个元素提供 NaN。
此代码在 Linux Mint15 的 GTX650 Ti Boost 上运行。我正在使用 NSight,控制台输出编译命令是:
Invoking: NVCC Compiler
/usr/local/cuda-5.5/bin/nvcc -G -g -O0 -gencode arch=compute_30,code=sm_30 -odir "" -M -o "main.d" "../main.cu"
/usr/local/cuda-5.5/bin/nvcc --device-c -G -O0 -g -gencode arch=compute_30,code=compute_30 -gencode arch=compute_30,code=sm_30 -x cu -o "main.o" "../main.cu"
Cuda 版本是 5.5 CUB 版本 1.0.2
这是在另一台装有 Cuda 6、OSX10.9.2、CUB 1.2.3 并运行 GT750M 的计算机上测试的,并重现了最后 8 个数字为 NaN 的错误
编辑:代码在 int 和 double 下正常工作,但不是 float。
编辑:感谢 Robert Crovella,这个问题最初是针对 DeviceReduce 提出的。该代码有效,它抛出了 NaN,因为早期使用 DeviceScan 的代码将 NaN 作为输入提供给它。问题已修改以适应
【问题讨论】:
-
您显示的代码没有任何问题。 Here's a fully-worked example 基于您的第一个代码 sn-p。您遇到的问题要么是您未显示的代码的某些方面,要么是您的机器配置(CUDA 未安装/无法正常工作等)。发布完整的代码,尝试使用@987654325 运行您的代码@,和/或将proper cuda error checking 添加到您的代码中。
-
谢谢@罗伯特。事实证明,问题是来自较早的 DeviceScan 代码块的 NaN 输入。该问题已被重写并具有完全可编译的代码,可重现错误(对我而言)