二、 API讲解
记得小时候练过几天棍法,现在好像起式都记不起来啦,哈哈,只记得棍要齐眉,剑齐耳朵,不知道错没,hoho。大学的时候一直想给武术队的张锐学九节鞭,不过一直太忙,除了和他练习过几次散打对抗,看他刀+鞭,双刀,枪,剑,九节鞭练习过几次以外,到大学毕业,也都没机会学九节鞭,~现在也就留着那一根九节鞭在身边。看到它就能想起一些朋友吧:)大学毕业也就各奔东西,都不知道他现在在干嘛……
又走神了……想想前面五个部分,下面一部分一部分的讲解:
1. 一些通用的函数:
数学函数,前面章节已经讲了,提一下CUDA 2.0里面添加了一两个新的函数。
时间函数,clock()这个自己去查C的函数库;还有CUDA提供的几个时间函数,用起来也没什么难的,只是说一些,CUDA提供的几个时间函数在计算Device上的运行时间的时候,和CPU上的时间函数比起来还不是那么的完美的准确,所以在做时间数据的时候,最好多取几次求个平均。
同步函数前面章节讲到了, __syncthreads()函数,原子操作函数也就和以前的原子操作函数一个道理,也不用多加解释。不过其实我都觉得这__syncthreads()函数都应该归到程序运行控制部分。
2.Device管理
Runtime和Driver层面的API都提供了设备管理的函数,其实两个层面的API提供的功能都差不多,可以在API的说明中查到他的区别。这里需要指出来的是虽然Host主机上的多线程程序是应该可以同时访问同一块显卡(Device)的,毕竟显卡就是按照PCIE标准插在PCI插槽上的标准设备(也有AGP接口的),这就是一个多线程访问硬件的问题了。So~本来是应该可以的。但是由于CUDA的设计原因,这里的host上的当个多线程的线程每个线程都要执行CUDA kernel的时候,就必须执行在多个Device上面。保证每个线程访问的Device不是同一个。多个线程线程A不能分享线程B在Device上创建的资源。
Runtime API:cudaGetDeviceCount() 和 cudaGetDeviceProperties() 提供了遍历硬件设备,得到某个设备性能参数的功能。
cudaGetDeviceCount(&deviceCount);
int device;
for (device = 0; device < deviceCount; ++device) {
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, device);
}
cudaSetDevice() 设置某一块Device作为这个主机host上的某一个运行线程的设备:
cudaSetDevice(device);
这个函数必须要在使用 __global__ 的函数或者Runtime
的其他的API调用之前才能生效。 如果没有调用cudaSetDevice(),device 0 就会被设置为默认的设备,接下里的如果还有cudaSetDevice()函数也不会有效果。
Driver API:
cuDeviceGetCount()和cuDeviceGet() 看名字就知道干嘛的~(英语不好的这应该能看明白吧- -!不要被我这个那国家四级都没过的人BS你哈~!~)
cuDeviceGetCount(&deviceCount);
int device;
for (int device = 0; device < deviceCount; ++device) {
CUdevice cuDevice;
cuDeviceGet(&cuDevice, device);
int major, minor;
cuDeviceComputeCapability(&major, &minor, cuDevice);
}