关于CUDA程序结构

最近开始学习,看了一些例子也做了几个例子,发现基本上例子里的源代码都是由,宿主上的内核函数,主函数加上设备上的函数组成,想请教一下:1、是否可以理解这就是CUDA程序代码的基本结构;2、我们是否可以把设备上的函数看做是接口函数;3、CUDA对C做了扩展,加入了很多C++的元素,那做程序时可以直接按着C++来写代码么;4、手册里讲内核函数可以调用设备里的函数,那么内核函数可以被设备里的函数和宿主上的主函数调用么,宿主上的函数可以调用设备里的函数吗。

LZ您好,无法理解您的一些术语,请您尽量使用英文表达这些术语。

比如您的“宿主”指的是?因为您提到“宿主上的内核函数”,而且如果您这里的“内核函数”指的是kernel function,那么您的“宿主”指的是GPU么?如果是的话,后文中的“设备”又指的是?

所以,请您解释说明/补充说明一下您1#的内容,以便他人理解。

祝您好运~

手册里说 使用host定义的函数 是由cpu调用,并在cpu上执行, 使用device定义的函数由gpu调用,并在gpu上执行 ,而使用global定义的内核函数(也就是kernel function)是由cpu调用,但是在gpu上执行。如果不用以上的定义符就默认都是用host定义。
我不明确的是1、在CUDA程序里用device定义的函数是不是必须存在,那些用CUDA开头的函数是不是只能用在用device定义的函数里。2、手册里说global定义的内核函数(也就是kernel function)是由cpu调用,但是在gpu上执行,但是我看了很多例子,里面的kernel function都是在device定义的函数里调用的3、CUDA对C做了扩展,加入了很多C++的元素,那做程序时可以直接按着C++来写代码么。

LZ您好:

1:“使用host定义的函数 是由cpu调用,并在cpu上执行”,“如果不用以上的定义符就默认都是用host定义”,您可以认为这个就是普通的c/c++的一般意义上的函数。

2:“使用device定义的函数由gpu调用,并在gpu上执行”,您可以简单认为如果要把kernel里面某部分拿出来作为一个函数使用,那么可以写成这种__device__函数。

3:“而使用global定义的内核函数(也就是kernel function)是由cpu调用,但是在gpu上执行”这就是我们最常见的kernel函数。一般由host端调用和传入参数,device端执行。以及需要说明的是,最新的计算能力3.5的kepler GPU可以由kernel启动kernel,这个和传统的说法是有所不同的。

------------------------以下是回答您直接提问的部分-------------------------
1:“在CUDA程序里用device定义的函数是不是必须存在,那些用CUDA开头的函数是不是只能用在用device定义的函数里”,__device__定义的函数不是必须存在的,您可以把代码全部写到kernel里面。
cuda开头的函数(如cudaMemcpy()等)是cuda Runtime API提供的API函数,和__device__函数无关的,他们是在host端使用的,无法用在device端的代码里面。

2:“手册里说global定义的内核函数(也就是kernel function)是由cpu调用,但是在gpu上执行,但是我看了很多例子,里面的kernel function都是在device定义的函数里调用的”,请您给出具体出处和详情。目前除了SM 3.5的kepler GPU以外,其他GPU无法在device端自己启动kernel的,只能在host端启动kernel。

3:“CUDA对C做了扩展,加入了很多C++的元素,那做程序时可以直接按着C++来写代码么。”host端代码部分您一般可以随便试用c++的特性,device端的代码(kernel和__device__函数)只支持一部分c++的特性,您可以查阅一下相关文档并决定您的用法。但是我不是c++用户,无法为您建议更多。

您的问题大致如上,祝您编码顺利~

谢谢版主,是我理解错了,其实和正常的C程序结构上蛮接近的。。。。我把简单的事情想复杂了。呵呵。

不客气的,欢迎您常来论坛讨论~

祝您编码顺利~

有个新问题请教版主。在很多代码中看到类似int main(int argc, char **argv) 这样的写法,int argc和char **argv这两个参数通常都是和程序使用的GPU有关,我想问一下,在CUDA编程时,是否需要在主函数里用固定的函数或者语句调用GPU,如果需要应该是什么形式,因为看了很多代码,都不太相同。