当CUDA内核被调用时会发生什么
what happens when a CUDA kernel is called?
我想知道当像
这样的行在CUDA程序中会发生什么myKernel<<<16,4>>>(arg1,arg2);
遇到.
然后发生了什么?是CUDA驱动程序调用和ptx代码传递给它或什么?
" just works"。只是开玩笑。也许我会因为张贴这个答案而受到批评,因为我在这方面的知识并不广泛。但这是我能说的:
- nvcc代码处理器是一个编译器驱动程序,这意味着它使用多个编译器并在一个方向或另一个方向上引导代码块。如果您有这样的问题,您可能需要在这里阅读更多关于nvcc工具链的信息。无论如何,一个 nvcc工具将做的事情是用一系列api调用(由各种cuda和GPU api库提供)替换内核启动语法
mykernel<<<...>>>
。这就是cuda驱动程序在引擎盖下被"调用"的方式。 - 作为调用序列的一部分,驱动程序将执行各种任务。它将检查可执行文件,看它是否包含适当的SASS(设备组装)代码。该设备实际上并不执行PTX,它是一种中间代码,而是执行SASS。如果没有合适的SASS可用,但是映像中有PTX代码可用,驱动程序将执行一个jit编译步骤来创建SASS。(事实上,其中一些实际上发生在上下文创建时间/CUDA延迟初始化,而不是在内核启动时。) 此外,在调用序列中,驱动程序将进行各种类型的设备状态检查,数据有效性检查(例如内核启动配置参数)和数据复制(例如内核sass代码,内核参数)到设备。最后,驱动程序将在设备上启动执行,然后立即将控制权返回给主机线程。
可能会有人给出更好更详细的解释
相关文章:
- 什么时候调用组成单元对象的析构函数
- 什么时候调用析构函数
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- boost odeint什么时候真正调用观测者
- unique_ptr:在分配之前调用 reset 有什么效果
- 是什么让放置新调用对象的构造函数?
- 使用基类指针调用基类的值构造函数的语法是什么?
- C++:使用方法调用析构函数的顺序是什么?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 什么是仅调用一次并调用参数的控制台应用
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 什么时候可以使用常量装饰调用我的重载函数?
- 如果结构中的字符串比使用的 p/调用签名长或短,会发生什么情况?
- 我正在尝试学习如何在 c++ 中传递指针,但出现错误:没有用于调用"test"的匹配函数。我做错了什么?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- "noexcept-expression 由于对......的调用而计算为'假'"是什么意思?
- 运算符++();调用和++(*this)有什么区别?
- C++ 此函数调用之前的(void)有什么作用?
- C++:将向量传递给函数,然后在main中调用函数.错过了什么