CUDAExample-0-cdpSimplePrint

该博客详细介绍了CUDA动态并行的一个例子,重点讨论了如何在GPU上实现递归核函数。主要内容包括:通过命令行参数传递机制,设备全局变量,检查命令行标志的函数,获取命令行参数的整数函数,GPU设备属性的获取,以及递归核函数的实现。程序运行结果显示,GPU能够根据设定的最大深度动态地启动新的线程块,展示了CUDA动态并行的强大功能。
摘要由CSDN通过智能技术生成

标签: CUDAExample


作用

>
* Key Concepts: CUDA Dynamic Parallelism *
It generates a unique identifier for each block. Prints the information about that block. Finally, if the ‘max_depth’ has not been reached, the block launches new blocks directly from the GPU.

例程中使用了递归思想,在核函数中打印处每一个线程块中threads为0的所在的线程块,以及它对应的parent线程块,重点说明了cuda架构可以动态的并行计算。

所使用的技巧

递归, device全局变量, 命令行得到参数, 字符串匹配, 设备属性计算能力, 共享内存, 设备函数

代码分析

main函数传参机制

int main(int argc, char **argv)
  • main 前面的 int 则说明main函数返回值是整形,一般是正常退出返回0,异常则是-1.
  • 参数 argc 则是表示 argv 的个数.
  • argv 则是命令行参数. 这个参数是通过命令提示符窗(Linux称为终端)口运行程序,以空格区分参数格式带入的。
  • char **argv 就好理解了,它就是一个指向字符串的指针。
  • argc 是字符串的个数,如device is ready , 则argc = 3, gagv[0] 为字符串,argv[0][n]表示字符

设备端全局变量

__device__ int g_uids = 0;

checkCmdLineFlag()函数解析

inline bool checkCmdLineFlag(const int argc, const char **argv, const char *string_ref)
{
    bool bFound = false;

    if (argc >= 1)
    {
        for (int i=1; i < argc; i++)
        {
            int string_start = stringRemoveDelimiter('-', argv[i]);    //返回给个字符串中非“-”的第一个字符的位置
            const char *string_argv = &argv[i][string_start];   //二维数组中非"-"d 开始

            const char *equal_pos = strchr(string_argv, '=');  //查找字符串中首次出现字符=的位置
            int argv_length = (int)(equal_pos == 0 ? strlen(string_argv) : equal_pos - string_argv);

            int length = (int)strlen(string_ref);

            if (length == argv_length && !STRNCASECMP(string_argv, string_ref, le
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值