CUDA编程接口(二)------一十八般武器------GPU的革命

CUDA编程接口(二)------一十八般武器
------GPU的革命

<!--[if !supportLists]-->4. <!--[endif]-->程序运行控制:像StreamEventContext, Module, Execution control这样的咱都把归类到运行管理的。这里也得分清楚有Runtime级别的,也有Driver级别的。

Stream:如果了解AGP时代的显卡,就知道在DeviceHost之间进行数据交换的时候有作为中转数据的部分,叫着stream;发展到G8X以后就有了新的专门针对GPGPU统一设计的方便数据传输的Stream out的硬件设备。这个层的功能是将Vertex ShaderPixel Shader(在G8X的设计中已经差不多不用把他们俩再分开,差不多统一起来)处理完成的数据输出给用户,由用户进行处理后再反馈给流水线继续处理。它可以直接读写本地显存。如果是内存对齐的,速度会更快,这个部分可以参考simpleStream的代码。

Event:和平时的大家在编程中使用的Event一个道理,都是起到通知的作用,创建一个事件,然后同步;Event在多线程编程中会经常遇到。

Context:上下文,什么叫叫上下文- -!(中文翻译叫上下文,实在的,俺觉得这个翻译不恰当,但是很多传统的书都这么翻译了,咱们也只能叫上下文)这里的ContextCPU里面使用的Context差不多,都是一个process里面需要用到的一些“资源”(系统资源:堆栈,内存……等等)。我倒觉得翻译为process包含的东东更为恰当。

Module:可以理解为linux里面的module意思;如果你不了解linux也不用担心,module就是一个个的专门针对Device的程序。知道很久很久以前的dos时代就有的.com文件吗?那个东东就像直接在CPU上可以调用的一个文件,加载到内存中就可以运行的。这里的module就是加载到Device上就可以运行。

Execution control:这个就是从驱动层面来控制线程怎么在Device上运行。

StreamEventRuntime APIDriver API中都有,函数接口也差不多。

Context, Module, Execution control就只有在Driver API层面才有。

上面的这些都没多少难点,其实API的讲解,一般都没多少难点,难点在于怎么能灵活的运用API,那就得通过多次的练习,多用API实践;其实有的时候也能发现API的不足,才会产生新的API。这里就不放具体的代码,代码可以参考编程手册上面。

<!--[if !supportLists]-->5. <!--[endif]-->好了,这里就剩下OpenGLDirect3D的接口函数了,他也有两个层次的API,有Runtime层次的,也有Driver层次的。RuntimeDriver层面都有调用的APICUDA2.0在这里也做了一些优化,在内存交换方面。具体代码参考编程手册。

前面说过要讲解函数的定义,其实在以前的帖子里面正好已经翻译过一段,不过现在要讲解,也就提出来,专门再把那些东西翻出来:GPU NVIDIA_CUDA_Programming_Cuide_1.0 Chapter 4. Application Programming Interface

4.2.1 Function Type Qualifiers 函数类型
4.2.1.1 __device__
__device__ 规定的函数:
device 上执行。
只能在 device 上调用。
4.2.1.2 __global__
__global__ 定义了一个 kernel 函数:
device 上运行。
只能在 host 上调用
4.2.1.3 __host__
__host__ 定义的函数:
host 上运行,
只能在 host 上调用。
没有定义 __host__ __device__ 或者 __global__ 的函数等同于 __host__ 函数,系统都会把函数编译成 host 函数。
另外, __host__ 定义可以和 __device__ 定义一起使用,编译器会把这个函数编译为 host device 通用的函数。
4.2.1.4 Restrictions ( 强调,限制 )
__device__ 函数通常是 inline ,所以如果需要不 inline 就需要加上uninline
__device__ __global__ 函数都不支持递归调用。
__device__ __global__ 函数都不能定义 static 变量在函数内部。
__device__ __global__ 函数不能使用可变参数。
__device__ 函数没有函数地址,也没有指向它的函数指针,但是 __global__ 函数有。
__global__ 定义和 __host__ 定义不能一起使用。
__global__ 函数必须是 void 返回类型。
任何调用 __global__ 的函数都必须指明运行配置。( Section 4.2.3 ) 也就是线程 kernel的调用方法。
__global__ 函数是异步调用的。在运行结束前就会返回。
__global__ 函数的参数通常是通过 shared memory调用到Device中,最多是 265bytes

本文出自 “开勇” 博客,转载请与作者联系!

你可能感兴趣的:(CUDA,职场,GPU,休闲,编程接口)