在GPU中Reduce算法是一种快速归约数据的方法,具体内容单击此处跳转。在CUDA实现的过程中,如果处理不当,会导致Debug版本与Release版本结果不一致的现象,这是由于Debug下不会对代码做优化,而Release下“过度优化”了代码,导致程序并没有按照我们的原意执行,最终结果错误。
简单的讲,如上图所示,若要对8个元素求最小值,那么只需要先做对(4,5)、(6,2)、(3,7)、(1,8)四对数求最小值,再折半地对(4,3)、(2,1)求最小值,最后对(3,1)求最小值,总计3次并行的操作即可得到对8个数归约(求最小值)的结果。
运行环境 | |
---|---|
系统 | Windows 10 |
IDE | VS 2013 |
CUDA版本 | 9.0 |
GPU | TITAN X (Pascal) |
实验:对输入数组data中从0到255共256个数统计其中奇数的个数,主函数部分:(由CPU完成显存内存的分配、数据的初始化、调用CUDA核函数、得到数据后释放显存)
int main(int main_argc, char ** main_argv)
{
// 初始化CUDA设备
init_CUDA(main_argc, main_argv);
int data[256], *dev_data;
int result, * dev_result;
// 分配 CUDA 显存
checkCudaErrors(cudaMalloc(&dev_data, 25