CUDA C运行时机制:
运行时在链接到应用程序的cudart库中实现,可以静态地通过cudart.lib或libcudart.a来实现,也可以通过cudart.dll或libcudart.so来动态实现。 需要cudart.dll或cudart.so进行动态链接的应用程序通常将它们作为应用程序安装包的一部分。
所有的入口点都以cuda为前缀。
正如异构编程中提到的那样,CUDA编程模型假设一个由主机和设备组成的系统,每个系统都有自己独立的内存。 设备内存概述了用于管理设备内存的运行时功能。
共享内存说明了使用线程层次结构中引入的共享内存来最大化性能。
页面锁定的主机存储器引入了页面锁定的主机存储器,它将内核执行与主机和设备存储器之间的数据传输重叠。
异步并发执行描述了用于在系统的各个级别启用异步并发执行的概念和API。
多设备系统显示了编程模型如何扩展到多个设备连接到同一主机的系统。
错误检查描述如何正确地检查运行时生成的错误。
调用堆栈提到用于管理CUDA C调用堆栈的运行时功能。
纹理和表面内存提供纹理和表面内存空间,提供访问设备内存的另一种方式; 他们也显示了GPU纹理硬件的一个子集。。
图形互操作性引入了运行时提供的与两个主要图形API,OpenGL和Direct3D互操作的各种功能。
初始化:
对于运行时机制,这里没有明显的初始化函数; 它首次初始化一个运行时函数被调用(更具体地说是除参考手册的设备和版本管理部分的功能以外的任何功能)。 在计算运行时函数调用时以及将第一次调用的错误代码解释为运行时时,需要记住这一点。
在初始化期间,运行时为系统中的每个设备创建一个CUDA上下文(有关CUDA上下文的更多详细信息,请参阅CUDA context)。 此上下文是此设备的主要上下文,它在应用程序的所有主机线程中共享。 作为这种上下文创建的一部分,设备代码在必要时即时编译(请参阅即时编译)并加载到设备内存中。 这一切都发生在底层,运行时不会将主要上下文暴露给应用程序。
当主机线程调用cudaDeviceReset()时,这破坏了主机线程当前操作的设备(即,设备选择中定义的当前设备)的主要上下文。 任何将此设备设为最新的主机线程所进行的下一次运行时函数调用将为此设备创建一个新的主要上下文。