CUDA-Programming icon indicating copy to clipboard operation
CUDA-Programming copied to clipboard

Sample codes for my CUDA programming book

Results 14 CUDA-Programming issues
Sort by recently updated
recently updated
newest added

如题。个人GPU为GeForce RTX 4090。 在个人所练习的CUDA 12.5版本中,cuda-memcheck已被废弃,P45【关于CUDA-MEMCHECK的更多内容,参见https://docs.nvidia.com/cuda/cuda-memcheck。】这段文字已完全失效!我看目前的勘误表里尚未订正,特地声明。

首先我必须感谢作者的工作,本书教程简明扼要对本人学习cuda算法帮助很大。 我尝试使用listing9.1中的原子函数规约求一个大矩阵的元素和,输入的d_x是unsigned char类型,但实际上数组能保证每个元素都没有小数位。规约时进行了一次类型转换 s_y[tid] = (n < N) ? static_cast(d_x[n]) : 0.0; //这里real是float 这时候发现结果每次运行会不一样,且与cpu逐元素相加的结果有个较小的误差(111654301+-30左右)。后面尝试在cpu将数组转换为real类型再进行规约相加,多次运行结果依然会有偏差。经检查后发现可能是浮点数表示误差的积累,将数组转换为int得到了和cpu计算相同的结果。我这里不太理解为什么cuda会发生这种偏差而cpu中不会,理论上float的浮点数的编码应该是一样的。如果我想要进行float的相加,如何在9.1程序的基础上避免这误差累积。 其次我发现我在.cu的host函数中使用模板定义函数,同时在.cuh中声明,在.cpp中调用时会报错LNK2019和LNK1120,无法解析外部符号和无法解析命令,而我尝试在__global__函数使用模板编译正常。是nvcc编译器的问题吗?这种情况如何实现函数的复用,比如写一个规约函数可以对不同类型的数组规约求和,只能函数重载吗?

输入的编译命令为:nvcc _O3 _DUSE_DP xxx.cu。报错信息如下:9.cu(37): error: no instance of overloaded function "atomicAdd" matches the argument list argument types are: (real *, real) atomicAdd(&d_y[0],x[0]); ^ C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6\include\sm_20_atomic_functions.hpp(82): note #3326-D:...

第一处: 在 `3.3 自定义设备函数` 的 `3.3.1 函数执行空间标识符` 一节中,介绍不同标识符时: `用 __device__ 修饰的函数叫称为备函数,`这句中疑似将 `称为设备函数`误写为 `叫称为备函数`。 第二处: 在 `5.2.1 数据传输的比例` 一节第一段,介绍显存带宽理论值时写到:`典型 GPU 的显存带宽理论值为几百吉字节每秒` 这里疑似将 `几百G字节每秒` 误写为 `几百吉字节每秒`