标签: 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