当前位置:   article > 正文

使用Nsight如何实现核函数的递归或者嵌套_nsight compute 可以嵌入到代码里吗

nsight compute 可以嵌入到代码里吗

实现cuda+ubuntu+nsight+动态并行,需要实现核函数的嵌套或者递归。

第一种方式使用命令行NVCC编译:

 nvcc 111.cu -rdc=true -arch=sm_52

只要-rdc=true 就可以了;

第二钟方式,在NSight:
 

在新建工程的时候需要打开

要不然会报错。

例如:我需要这么一行代码

核函数中需要嵌套一个核函数,实现动态并行。

编译器会报错

../src/deviceGpu.cu(5): error: kernel launch from __device__ or __global__ functions requires separate compilation mode

1 error detected in the compilation of "/tmp/tmpxft_00003c34_00000000-6_deviceGpu.cpp1.ii".
make: *** [src/deviceGpu.o] Error 1
src/subdir.mk:33: recipe for target 'src/deviceGpu.o' failed

解决办法就是打开

这个选项。

在什么位置哪?

右击项目-》属性-》build-》settings-》cuda

勾选,保存,编译没得问题了。完美解决,据说需要sm>2.0因为我的GPUsm是5.2的。没有报错,2.0的太老了,似乎NVIDIA公司已经不支持了。

 

------------------------------------分割线2019.5.20-----------------------------------------------------------------------------------------------------

补充一点:

关于__global__和__device__函数的用法(自己总结的可能不太全面)

关于__global__ 可以被__global__调用无返回值,但是必须有三个尖括号

必须是这样的。

这样会报错的。

而__device__以这个开头的是不需要尖括号的。

这样完全可以编译成功的。

 

来一个例子:

  1. #include <cuda_runtime.h>
  2. #include <iostream>
  3. #include <stdio.h>
  4. //#include <device_functions.h>
  5. __global__ void sam(double* d_sam,double* d_max,double* d_sum,int n)
  6. {
  7. double temp = 0;
  8. int iidx = threadIdx.x;
  9. for(int i = 0; i < 4;++i)
  10. {
  11. temp += d_sam[n * 8 + iidx + i] * d_max[i];
  12. }
  13. d_sum[n * 5 + iidx] = temp;
  14. }
  15. __global__ void gpu(double* d_sam,double* d_max,double* d_sum)
  16. {
  17. int idx = threadIdx.x;
  18. switch(idx)
  19. {
  20. case 0:
  21. printf("case 0: = %d\n",idx);
  22. sam<<<1,5>>>(d_sam,d_max,d_sum,idx);
  23. __syncthreads();
  24. break;
  25. case 1:
  26. printf("case 0: = %d\n",idx);
  27. sam<<<1,5>>>(d_sam,d_max,d_sum,idx);
  28. __syncthreads();
  29. break;
  30. case 2:
  31. printf("case 0: = %d\n",idx);
  32. sam<<<1,5>>>(d_sam,d_max,d_sum,idx);
  33. __syncthreads();
  34. break;
  35. case 3:
  36. printf("case 0: = %d\n",idx);
  37. sam<<<1,5>>>(d_sam,d_max,d_sum,idx);
  38. __syncthreads();
  39. break;
  40. }
  41. }
  42. int main()
  43. {
  44. double* max = new double[4];
  45. double* samData = new double[4*8];
  46. double* sum = new double[4 * 5];
  47. double *d_sam,*d_max,*d_sum;
  48. cudaMalloc((void**)&d_sam,4 * 8 * sizeof(double));
  49. cudaMalloc((void**)&d_max,4 * sizeof(double));
  50. cudaMalloc((void**)&d_sum,4 * 5 * sizeof(double));
  51. for(int i = 0; i < 4; ++i)
  52. {
  53. for(int j = 0; j < 8; ++j)
  54. {
  55. samData[i * 8 + j] = i * 8 + j + 1;
  56. std::cout << "samData = " << samData[i * 8 + j] << " ";
  57. }
  58. std::cout << std::endl;
  59. }
  60. for(int i = 0; i < 4; ++i)
  61. {
  62. max[i] = i + 1;
  63. std::cout << "max = " << max[i] << " ";
  64. }
  65. std::cout << std::endl;
  66. cudaMemcpy(d_sam,samData,4 * 8 * sizeof(double),cudaMemcpyHostToDevice);
  67. cudaMemcpy(d_max,max,4 * sizeof(double),cudaMemcpyHostToDevice);
  68. gpu<<<1,4>>>(d_sam,d_max,d_sum);
  69. cudaMemcpy(sum,d_sum,4 * 5 * sizeof(double),cudaMemcpyDeviceToHost);
  70. for(int i = 0; i < 4; ++i)
  71. {
  72. for(int j = 0; j < 5; ++j)
  73. {
  74. std::cout << "sum[" << i << "][" << j <<"]= " << sum[i * 5 + j] << " ";
  75. }
  76. std::cout << std::endl;
  77. }
  78. std::cout << std::endl;
  79. return 0;
  80. }

执行结果:

解释一下:

数据是一个4*8的矩阵.要和一个1*4的数据做卷积和.做的是行向量卷积,得出的结果是一个4*5的矩阵.

什么意思那?

---------------------------2019.6.8-----------------------------------------------------------------------------

在这个全国高考的日子里,更新一个小问题,关于核函数递归的问题,会遇到二层核函数不启动的问题

比如这个核函数嵌套一个核函数,有时候核函数里面的核函数不启动,我遇到过这类问题,一般的就是<<<gridUpsamIdx,blockUpsamIdx>>>这里面的数大于理论值,一般是1024.只要把gridUpsamIdx,blockUpsamIdx设置的小于1024就能解决这一类问题.线程数实在是大的话,可以使用2D数据或者3D数据.

--------------------------------------2019.0818-----------------------------------

更新一点,想要核函数嵌套实现,必须都是__global__开头的才可以的,__device__开头是不可以的.实际操作得出.

例如:

neiji()这个函数必须是__global__ void neiji();这种形式才可以的.__device__ void neiji()是编译不过去的,具体原理不太清楚.有明白的大佬可以留言讨论.

总结一下:

__global__ 开头的核函数是可以实现嵌套并行的.

__device__开头的也是可以嵌套的,但是不可以再开线程了.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/320933?site
推荐阅读
相关标签
  

闽ICP备14008679号