
如何理解默认Device和默认Stream机制【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime问题现象描述现象1不调用aclrtSetDevice直接使用其他接口失败未调用 aclrtSetDevice 配置设备直接调用 aclrtMalloc 等接口时失败。错误代码示例aclInit(nullptr); aclrtMalloc(devPtr, size, ACL_MEM_MALLOC_HUGE_FIRST); // 失败没有指定Device现象2对默认Stream的创建时机和使用方式不理解不清楚默认Stream何时自动创建和销毁以及与显式创建Stream的区别。典型困惑aclrtSetDevice(0); // 自动创建默认Stream aclrtMemcpyAsync(devPtr, size, hostPtr, size, ACL_MEMCPY_HOST_TO_DEVICE, nullptr); // nullptr是默认Stream现象3混淆显式创建Stream和默认Stream的使用场景不理解何时传 nullptr默认Stream、何时传显式创建的Stream对象。可能原因未配置 aclInit 的 defaultDevice 功能aclInit 默认不设置 defaultDevice需要显式调用 aclrtSetDevice。混淆默认Stream和显式创建Stream的使用场景不理解默认Stream的自动创建机制和销毁时机。不理解 Stream 传参规则需要Stream参数的接口默认Stream传 nullptr显式创建Stream传实际对象。处理步骤原因1未配置 aclInit 的 defaultDevice 功能解决方法配置 defaultDevice在 aclInit 的 json 配置文件中设置 defaultDevice理解 defaultDevice 作用启用后可不显式调用 aclrtSetDevice接口内部自动进行隐式 aclrtSetDevice配置示例{ defaultDevice:{ default_device:0 } }使用示例// 启用 defaultDevice 后 aclError ret aclInit(../acl.json); // json中配置了defaultDevice0 // 可以直接调用运行时接口无需显式 aclrtSetDevice aclrtMalloc(devPtr, size, ACL_MEM_MALLOC_HUGE_FIRST); // 成功 // 去初始化 aclrtResetDeviceForce(0); aclFinalize();原因2混淆默认Stream和显式创建Stream的使用场景解决方法理解默认Stream创建时机aclrtSetDevice 或 aclrtCreateContext 时自动创建默认Stream理解默认Stream销毁时机aclrtResetDevice 或 aclrtResetDeviceForce 时自动销毁默认Stream区分两种Stream显式创建的Stream需调用 aclrtDestroyStream 销毁默认Stream不能显式销毁默认Stream使用示例aclrtSetDevice(0); // 自动创建默认Stream // 默认Stream传 nullptr aclrtMemcpyAsync(devPtr, size, hostPtr, size, ACL_MEMCPY_HOST_TO_DEVICE, nullptr); // 同步默认Stream aclrtSynchronizeStream(nullptr); // nullptr 表示默认Stream aclrtResetDevice(0); // 自动销毁默认Stream显式创建Stream示例aclrtSetDevice(0); aclrtStream stream; aclrtCreateStream(stream); // 显式创建Stream // 显式Stream传实际对象 aclrtMemcpyAsync(devPtr, size, hostPtr, size, ACL_MEMCPY_HOST_TO_DEVICE, stream); // 销毁显式创建的Stream aclrtDestroyStream(stream); // 必须显式销毁 aclrtResetDevice(0);原因3不理解 Stream 传参规则解决方法需要Stream参数的接口如 aclrtMemcpyAsync默认Stream传 nullptr显式创建Stream传实际对象不需要Stream参数的接口如 aclrtMemcpy不使用默认Stream属于同步接口传参规则总结// 异步接口需要Stream参数 aclrtMemcpyAsync(..., nullptr); // 使用默认Stream aclrtMemcpyAsync(..., stream); // 使用显式创建的Stream // 同步接口不需要Stream参数 aclrtMemcpy(..., ACL_MEMCPY_HOST_TO_DEVICE); // 不使用Stream同步执行相关 issueIssue #344: device、context、stream关系咨询【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考