2022CUDA夏季训练营Day1实践之TIPS
前情回顾:
2022CUDA夏季训练营Day1实践 https://bbs.huaweicloud.com/blogs/364478
TIPS1:解决jupyter lab中sudo时需要密码的问题
Jupyter Lab是一个很好的东西。它让编程可视化了。
然而,如果你执行这样的指令:
!sudo /usr/local/cuda/bin/nvprof --print-api-trace ./hello_cuda
那就有点糟糕了:
因为它会问你要密码,但是却不给你输入密码的地方。
于是你只有等着左边的星号一时亮着。。。并不会像其他的cell那样执行后变成一个数字。
然而,并不是没有解决的方法的。你可以试着这样:
!echo nano|sudo -S /usr/local/cuda/bin/nvprof --print-api-trace ./hello_cuda
把密码作为管道后面的输入。
你会发现,居然他能运行了!
TIPS2:一个错误加深了对CUDA异步执行的理解
张小白在Jupyter Lab中执行cuda的helloworld(对不起,都第三遍helloworld了)发现一个奇怪的现象,有时候,编译执行后会有输出,有时候,编译执行后并没有输出。但是执行nprof的时候一直都有输出。
于是张小白请教了老师:
老师指出,我的代码中少了个同步过程。即少了 cudaDeviceSynchronize();
因为CUDA的代码本身是异步执行的。程序指令发出就结束了。这个时候,如果没有 执行cudaDeviceSynchronize(),做同步等待,那么有可能结果在程序执行完毕前会出来,有可能结果会在程序执行完毕后才会出来。那个时候,调用方的程序早就退出了。这也导致了张小白发现的古怪现象——有时候有结果,有时候没结果。
加上同步后代码如下:
#include <stdio.h>
__global__ void hello_from_gpu()
{
printf("Hello World from the GPU!\n");
}
int main(void)
{
hello_from_gpu<<<2,2>>>();
cudaDeviceSynchronize();
return 0;
}
执行后效果如下:
这回,无论是nvcc编译时直接加上-run参数,还是编译后单独运行,或者是在nvprof中运行,都有打印的结果了。
这样也好,加深一下印象。以后代码中也不会出现忘记加同步的错误了吧。。。(没准还会有!)
(全文完,谢谢阅读)
- 点赞
- 收藏
- 关注作者
评论(0)