-
如果问题规模较小,逻辑控制较为复杂,并行性很小优先使用CPU处理该问题,如果包含较大规模的数据处理,则考虑使用GPU进行处理。
-
CPU上线程是重量级实体,可以开启1~32个线程,且上下文切换较为缓慢,GPU上线程是高度轻量级的,可以开几百甚至上千个线程。
-
CUDA通过两种API来对设备GPU设备进行控制,包括驱动API和运行API,其中驱动API较难编程,但是设备控制能力和利用率高。两者只能选择其中一种,不能混合使用。
-
一个CUDA程序包含了两个部分代码,在CPU上运行的主机代码和在GPU上运行的设备代码。
-
判断自己的主机上是否存在nvidia设备可以使用命令:
ls -l /dev/nv*
-
hello.cu代码:
#include <cuda_runtime.h>
#include <stdio.h>
__global__ void HelloFromGPU(void)
{
printf("Welcome to CUDA!\n");
}
int main(){
cudaSetDevice(0);
HelloFromGPU<<<1,10>>>();
cudaDeviceReset();
return 0;
}
-
在这个代码中调用了10个GPU线程,cudaSetDevice(int)是对GPU的特定选择,而cudaDeviceReset()用来释放和清空所有在GPU中的资源。在进行程序生成运行的时候需要使用
nvcc -arch sm_61 hello.cu -o hello
来运行,-arch sm_61是个开关语句,使编译器为Pascal架构生成设备代码,以运行,sm_61是与具体设备有关,如果设备的计算能力不同那么对应的也不一样,一旦运行错误的运算能力,可能也无法得到想要的结果。