|
| 1 | + |
| 2 | +# `InfiniRT` 统一运行时库 |
| 3 | + |
| 4 | +## 简介 |
| 5 | + |
| 6 | +*InfiniRT* 是一个跨平台统一运行时库,对不同芯片平台的运行时和驱动功能进行了统一封装。 |
| 7 | + |
| 8 | +## 编程接口 |
| 9 | + |
| 10 | +### 1. 设备管理 |
| 11 | + |
| 12 | +#### 初始化设备环境 |
| 13 | + |
| 14 | +``` c++ |
| 15 | +infiniStatus_t infinirtInit(); |
| 16 | +``` |
| 17 | + |
| 18 | +- 初始化所有可用设备类型的运行时环境(如启用的 Ascend)。 |
| 19 | +- 仅在使用前调用一次。 |
| 20 | +#### 获得设备所有设备数量 |
| 21 | + |
| 22 | +``` c++ |
| 23 | +infiniStatus_t infinirtGetAllDeviceCount(int *count_array); |
| 24 | +``` |
| 25 | +
|
| 26 | +- `count_array`: 数组长度至少为 [`infiniDevice_t`] 中设备种类数量,每种设备数量会写入数组的相应位置。 |
| 27 | +
|
| 28 | +#### 获取当前设备信息 |
| 29 | +
|
| 30 | +``` c++ |
| 31 | +infiniStatus_t infinirtGetDevice(infiniDevice_t *device_ptr, int *device_id_ptr); |
| 32 | +``` |
| 33 | + |
| 34 | +- device_ptr: 返回当前设备类型(可为 nullptr)。 |
| 35 | + |
| 36 | +- device_id_ptr: 返回当前设备 ID(可为 nullptr)。 |
| 37 | +#### 获得特定设备数量 |
| 38 | + |
| 39 | +``` c++ |
| 40 | +infiniStatus_t infinirtGetDeviceCount(infiniDevice_t device, int *count); |
| 41 | +``` |
| 42 | +
|
| 43 | +- `device`: 设备种类。 |
| 44 | +- `count`: 存储设备数量查询结果的指针。 |
| 45 | +
|
| 46 | +#### 设置当前使用的设备 |
| 47 | +
|
| 48 | +``` c++ |
| 49 | +infiniStatus_t infinirtSetDevice(infiniDevice_t device, int device_id); |
| 50 | +``` |
| 51 | + |
| 52 | +- device: 要设置的设备类型。 |
| 53 | +- device_id: 要设置的设备 ID。 |
| 54 | + |
| 55 | +#### 同步当前设备 |
| 56 | + |
| 57 | +``` c++ |
| 58 | +infiniStatus_t infinirtDeviceSynchronize(); |
| 59 | +``` |
| 60 | + |
| 61 | +- 阻塞直到当前设备完成所有计算。 |
| 62 | + |
| 63 | +### 2. 流管理 |
| 64 | + |
| 65 | +#### 创建设备流(Stream) |
| 66 | + |
| 67 | +``` c++ |
| 68 | +infiniStatus_t infinirtStreamCreate(infinirtStream_t *stream_ptr); |
| 69 | +``` |
| 70 | +
|
| 71 | +- stream_ptr: 返回创建的 stream 对象。 |
| 72 | +
|
| 73 | +#### 销毁设备流 |
| 74 | +
|
| 75 | +``` c++ |
| 76 | +infiniStatus_t infinirtStreamDestroy(infinirtStream_t stream); |
| 77 | +``` |
| 78 | + |
| 79 | +- stream: 需要销毁的 stream 对象。 |
| 80 | + |
| 81 | +#### 等待流中所有任务完成 |
| 82 | + |
| 83 | +``` c++ |
| 84 | +infiniStatus_t infinirtStreamSynchronize(infinirtStream_t stream); |
| 85 | +``` |
| 86 | +
|
| 87 | +- stream: 需要同步的 stream。 |
| 88 | +
|
| 89 | +#### 让一个流等待一个事件 |
| 90 | +
|
| 91 | +``` c++ |
| 92 | +infiniStatus_t infinirtStreamWaitEvent(infinirtStream_t stream, infinirtEvent_t event); |
| 93 | +``` |
| 94 | + |
| 95 | +- stream: 需要等待的流。 |
| 96 | +- event: 被等待的事件。 |
| 97 | + |
| 98 | +### 3. 事件管理 |
| 99 | +#### 创建事件 |
| 100 | + |
| 101 | +``` c++ |
| 102 | +infiniStatus_t infinirtEventCreate(infinirtEvent_t *event_ptr); |
| 103 | +``` |
| 104 | +
|
| 105 | +- event_ptr: 返回创建的事件。 |
| 106 | +
|
| 107 | +#### 记录事件 |
| 108 | +
|
| 109 | +``` c++ |
| 110 | +infiniStatus_t infinirtEventRecord(infinirtEvent_t event, infinirtStream_t stream); |
| 111 | +``` |
| 112 | + |
| 113 | +- event: 要记录的事件。 |
| 114 | +- stream: 事件记录在哪个流上。 |
| 115 | + |
| 116 | +#### 查询事件状态 |
| 117 | + |
| 118 | +``` c++ |
| 119 | +infiniStatus_t infinirtEventQuery(infinirtEvent_t event, infinirtEventStatus_t *status_ptr); |
| 120 | +``` |
| 121 | +
|
| 122 | +- event: 需要查询的事件。 |
| 123 | +- status_ptr: 返回事件状态(已完成 / 未完成等)。 |
| 124 | +
|
| 125 | +#### 等待事件完成 |
| 126 | +
|
| 127 | +``` c++ |
| 128 | +infiniStatus_t infinirtEventSynchronize(infinirtEvent_t event); |
| 129 | +``` |
| 130 | + |
| 131 | +- event: 要等待的事件。 |
| 132 | + |
| 133 | +#### 销毁事件 |
| 134 | + |
| 135 | +``` c++ |
| 136 | +infiniStatus_t infinirtEventDestroy(infinirtEvent_t event); |
| 137 | +``` |
| 138 | +
|
| 139 | +- event: 需要销毁的事件。 |
| 140 | +
|
| 141 | +### 4. 内存管理 |
| 142 | +
|
| 143 | +#### 分配设备内存 |
| 144 | +``` c++ |
| 145 | +infiniStatus_t infinirtMalloc(void **p_ptr, size_t size); |
| 146 | +``` |
| 147 | + |
| 148 | +- p_ptr: 返回分配的内存指针。 |
| 149 | +- size: 要分配的内存大小(单位:字节)。 |
| 150 | + |
| 151 | +#### 分配页锁定主机内存 |
| 152 | + |
| 153 | +``` c++ |
| 154 | +infiniStatus_t infinirtMallocHost(void **p_ptr, size_t size); |
| 155 | +``` |
| 156 | +
|
| 157 | +- p_ptr: 返回分配的主机内存指针。 |
| 158 | +
|
| 159 | +- size: 分配的内存大小(单位:字节)。 |
| 160 | +
|
| 161 | +#### 释放设备内存 |
| 162 | +
|
| 163 | +``` c++ |
| 164 | +infiniStatus_t infinirtFree(void *ptr); |
| 165 | +``` |
| 166 | + |
| 167 | +- ptr: 需要释放的设备内存指针。 |
| 168 | + |
| 169 | +#### 释放页锁定主机内存 |
| 170 | + |
| 171 | +``` c++ |
| 172 | +infiniStatus_t infinirtFreeHost(void *ptr); |
| 173 | +``` |
| 174 | +
|
| 175 | + ptr: 需要释放的主机内存指针。 |
| 176 | +
|
| 177 | +#### 同步内存拷贝 |
| 178 | +
|
| 179 | +``` c++ |
| 180 | +infiniStatus_t infinirtMemcpy(void *dst, const void *src, size_t size, infinirtMemcpyKind_t kind); |
| 181 | +``` |
| 182 | + |
| 183 | +- dst: 目标地址。 |
| 184 | +- src: 源地址。 |
| 185 | +- size: 拷贝的字节数。 |
| 186 | +- kind: 枚举类型infinirtMemcpyKind_t |
| 187 | + 其定义如下: |
| 188 | +``` c++ |
| 189 | +typedef enum { |
| 190 | + INFINIRT_MEMCPY_H2H = 0, //Host to Host |
| 191 | + INFINIRT_MEMCPY_H2D = 1, //Host to Device |
| 192 | + INFINIRT_MEMCPY_D2H = 2, //Device to Host |
| 193 | + INFINIRT_MEMCPY_D2D = 3, //Device to Device |
| 194 | +} infinirtMemcpyKind_t; |
| 195 | + |
| 196 | +``` |
| 197 | + |
| 198 | +#### 异步内存拷贝 |
| 199 | + |
| 200 | +``` c++ |
| 201 | +infiniStatus_t infinirtMemcpyAsync(void *dst, const void *src, size_t size, infinirtMemcpyKind_t kind, infinirtStream_t stream); |
| 202 | +``` |
| 203 | +
|
| 204 | +- dst: 目标地址。 |
| 205 | +- src: 源地址。 |
| 206 | +- size: 拷贝的字节数。 |
| 207 | +- kind: 拷贝类型(见[infinirtMemcpy](#同步内存拷贝))。 |
| 208 | +- stream: 所用的异步流。 |
| 209 | +
|
| 210 | +#### 异步分配设备内存 (Stream-ordered memory) |
| 211 | +
|
| 212 | +``` c++ |
| 213 | +infiniStatus_t infinirtMallocAsync(void **p_ptr, size_t size, infinirtStream_t stream); |
| 214 | +``` |
| 215 | + |
| 216 | +- p_ptr: 返回分配的内存指针。 |
| 217 | + |
| 218 | +- size: 分配大小(单位:字节)。 |
| 219 | + |
| 220 | +- stream: 异步操作所用的流。 |
| 221 | + |
| 222 | +#### 异步释放设备内存 (Stream-ordered memory) |
| 223 | + |
| 224 | +``` c++ |
| 225 | +infiniStatus_t infinirtFreeAsync(void *ptr, infinirtStream_t stream); |
| 226 | +``` |
| 227 | +
|
| 228 | +- ptr: 要释放的设备内存地址。 |
| 229 | +- stream: 异步释放所用的流。 |
0 commit comments