Skip to main content

多线程多Stream

多线程多Stream

调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。

import acl
## ......
def run_thread(stream):
device_id = 0

# 如果只创建了一个Context,线程默认将这个Context作为线程当前的Context。
# 如果是多个Context,则需要调用acl.rt.set_context接口设置当前线程的Context。
context, ret = acl.rt.create_context(device_id)
stream, ret = acl.rt.create_stream()

# 调用触发任务的接口。
# ....

# 释放资源。
ret = acl.rt.destroy_stream(stream)
ret = acl.rt.destroy_context(context)


## 创建2个线程,每个线程对应一个Stream。
thread_id1, ret = acl.util.start_thread(run_thread, stream1)
thread_id2, ret = acl.util.start_thread(run_thread, stream2)
## 显式调用join函数确保结束线程。
ret = acl.util.stop_thread(thread_id1)
ret = acl.util.stop_thread(thread_id2)

父主题: Stream管理

基本原理

同步机制

pyACL提供以下几种同步机制:

  • Event的同步等待:调用acl.rt.synchronize_event接口,阻塞应用程序运行,等待Event完成。
  • Stream内任务的同步等待:调用acl.rt.synchronize_stream接口,阻塞应用程序运行,直到指定Stream中的所有任务都完成。
  • Stream间任务的同步等待:调用acl.rt.stream_wait_event接口,阻塞指定Stream的运行,直到指定的Event完成。支持多个Stream等待同一个Event的场景。接口调用流程请参见多Stream接口调用流程
  • Device的同步等待:调用acl.rt.synchronize_device接口,阻塞应用程序运行,直到正在运算中的Device完成运算。

父主题: 同步等待

关于Event的同步等待

调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。

import acl
## ......
## 创建一个Event。
event, ret = acl.rt.create_event()

## 创建一个Stream。
stream, ret = acl.rt.create_stream()

## stream末尾添加了一个event。
ret = acl.rt.record_event(event, stream)

## 阻塞应用程序运行,等待event发生,也就是stream执行完成。
## stream完成后产生event,唤醒执行应用程序的控制流,开始执行程序。
ret = acl.rt.synchronize_event(event)

## 显式销毁资源。
ret = acl.rt.destroy_stream(stream)
ret = acl.rt.destroy_event(event)
## ......

父主题: 同步等待

关于Stream内任务的同步等待

调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。

<br> 1<br> 2<br> 3<br> 4<br> 5<br> 6<br> 7<br> 8<br> 9<br>10<br>11<br>12<br>13<br>14<br>python<br>import acl<br># ......<br># 显式创建一个Stream。<br>stream, ret = acl.rt.create_stream()<br># 调用触发任务的接口,传入stream参数。<br>ret = acl.rt.memcpy_async(dev_ptr, dev_size, host_ptr, host_size, ACL_MEMCPY_HOST_TO_DEVICE, stream)<br># 调用acl.rt.synchronize_stream接口,阻塞应用程序运行,直到指定Stream中的所有任务都完成。<br>ret = acl.rt.synchronize_stream(stream)<br># Stream使用结束后,显式销毁Stream。<br>ret = acl.rt.destroy_stream(stream)<br># ......<br>

父主题: 同步等待

在线提单