aclrtLaunchCallback
产品支持情况
产品 |
是否支持 |
---|---|
|
√ |
|
√ |
|
√ |
|
√ |
|
√ |
|
√ |
功能说明
异步任务场景下,在Stream的任务队列中下发一个回调任务,系统内部在执行到该回调任务时,会在Stream上注册的线程(通过aclrtSubscribeReport接口注册的线程)中执行回调函数。
本接口是异步接口,调用接口成功仅表示任务下发成功,不表示任务执行成功。调用该接口后,需调用同步等待接口(例如,aclrtSynchronizeStream)确保任务已执行完成,否则可能会导致训练或推理等业务异常、Device断链掉卡等未知情况。
- 定义并实现回调函数,函数原型为:typedef void (*aclrtCallback)(void *userData);
- 新建线程,在线程函数内,调用aclrtProcessReport接口设置超时时间(需循环调用),等待回调任务执行;
- 调用aclrtSubscribeReport接口建立第2步中的线程和Stream的绑定关系,该Stream下发的回调函数将在绑定的线程中执行;
- 在指定Stream上执行异步任务(例如异步推理任务);
- 调用aclrtLaunchCallback接口在Stream的任务队列中下发回调任务,触发第2步中注册的线程处理回调函数,每调用一次aclrtLaunchCallback接口,就会触发一次回调函数的执行;
- 异步任务全部执行完成后,取消线程注册(aclrtUnSubscribeReport接口)。
函数原型
aclError aclrtLaunchCallback(aclrtCallback fn, void *userData, aclrtCallbackBlockType blockType, aclrtStream stream)
参数说明
参数名 |
输入/输出 |
说明 |
---|---|---|
fn |
输入 |
指定要增加的回调函数。 回调函数的函数原型为: typedef void (*aclrtCallback)(void *userData) |
userData |
输入 |
待传递给回调函数的用户数据的指针。 |
blockType |
输入 |
指定回调任务是否阻塞本Stream上后续任务的执行。 typedef enum aclrtCallbackBlockType {
ACL_CALLBACK_NO_BLOCK, //非阻塞, |
stream |
输入 |
指定Stream。 |
返回值说明
返回0表示成功,返回其他值表示失败,请参见aclError。
约束说明
回调函数涉及共享资源(例如锁),因此在使用回调函数需慎重,不应该调用资源申请、资源释放、Stream同步、Device同步、任务下发、任务终止等接口,否则可能导致错误或死锁。