今天开始正式学习CUDA,经过前几天的准备工作,已经有了一个基本的认识了。按照网友的意见,先来学习一下《深入浅出CUDA》。今后几天的几篇帖子就大多是讨论这篇文章里的东西了。
以前学习C语言的时候,由于学校很多东西不要求,所以现在来看这些都有点困难啊。慢慢来吧,还希望大家能够多多支持啊。
------------------------------------------------引用原文-------------------------------------------------------
要利用 CUDA 进行计算之前,要先把数据复制到显卡内存中,才能让显示芯片使用。因此,需要取得一块适当大小的显卡内存,再把产生好的数据复制进去。在 main 函式中加入:
GenerateNumbers(data, DATA_SIZE);
int* gpudata, *result;
cudaMalloc((void**) &gpudata, sizeof(int) * DATA_SIZE);
cudaMalloc((void**) &result, sizeof(int));
cudaMemcpy(gpudata, data, sizeof(int) * DATA_SIZE,
cudaMemcpyHostToDevice);
----------------------------------------------------over-------------------------
按照里面的提示,这个cudaMalloc函数和C语言的malloc差不多,但是查了一下啊,似乎后面一小截(siazeof后面的)可以理解,就是分配data_size个整数空间,那么前面的(void**) &gpudata是什么意思呢???
现在总结一下今天学习所得啊。
1.在CUDA构架下,显示芯片(GPU)执行的最小单位是thread,数个thread组成一个block,但所含thread数目有限;但是执行相同程序的block可以组成grid。
2.发现了几个函数,由于还没有看官方手册programming guide,所以只是初略的根据上下程序了解其意义。如有不对,还望更正。
cudaGetDeviceCount :取得支持cuda的装置数目
cudaDeviceProp : 一种数据类型,指的是cuda装置的属性
cudaGetDeviceProperties : 取得支持cuda的装置支持的 CUDA 版本,还有装置的名称、内存的大小、最大的 thread 数目、执行单元的频率等
cudaSetDevice : 设定指定装置为目前要使用的装置
cudaMalloc cudaMemcpy----------此二者如前所问问题。
3.在GPU中执行函式,语法规则是
<<<block数目,thread数目,share memory大小>>>(参数...)
4.关于计算时间的统计:
CUDA提供了专门的clock()函式,也有一种数据类型clock_t来定义存储时间的变量。
只要分别在程序运行始末各调用一次clock(),再将解雇相减就可以得出计算时间了。
5.为了充分发挥GPU并行计算的优势,在进行程序优化的时候,要充分考虑显存是DRAM类型,最好是连续存取方式。