第一章
GPU 版的 HelloWorld
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <cstdio>
__global__ void helloFromGPU(void)
{
printf("Hello World from GPU! Thread Id: %d\n", threadIdx.x);
}
int main(void)
{
// hello from cpu
printf("Hello world from CPU! \n\n");
helloFromGPU << <1, 10 >> > ();
cudaDeviceReset();
getchar();
return 0;
}
问题1:原来GPU中也可以输出,我之前一直以为不能的,也许直接走的总线输出?
问题2:为什么GPU输出只能用printf
,不能用cout
呢?
API
- cudaDeviceReset(void):释放当前进程中与设备有关的所有资源,并重置当前进程中的设备状态。
以上面代码为例,如果再调用一次helloFromGPU
的话,两次之间需要有cudaDeviceReset()
函数,不然只会调用前者。 - cudaDeviceSynchronize():同步设备端所有计算,没计算完会暂时阻塞。
笔记
- 主机代码是标准c代码,用c语言编译器进行编译;设备代码(核函数)使用
nvcc
进行编译 - 数据局部性:时间局部性(较短时间段内数据/资源的复用);空间局部性(相对较近的存储空间内的数据元素调用
- 现代CPU架构使用大容量缓存来优化具有良好空间局部性和时间局部性的应用程序
- CUDA 中有内存层次和线程层次的概念,可以对线程进行更高层次的调用
- 例如CUDA中的共享内存,可以视为一个被软件管理的高速缓存,通过为主内存节省带宽来大幅度提高运行速度。有了共享内存,可以直接控制代码的数据局部性。
网友评论