2022CUDA夏季训练营Day1实践之TIPS

举报
张辉 发表于 2022/07/12 15:00:38 2022/07/12
【摘要】 CUDA

前情回顾:

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中运行,都有打印的结果了。

这样也好,加深一下印象。以后代码中也不会出现忘记加同步的错误了吧。。。(没准还会有!)

(全文完,谢谢阅读)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。