12. 兼容性¶
为了让同一份代码可以同时适配GCU210和GCU300硬件,我们定义了一种新的抽象硬件架构:AGCU(Abstract GCU),用来表示一种基于硬件架构之上的抽象硬件架构设定。如果一份代码按照对应AGCU200的限制条件进行编写,就可以确保同时适配GCU210和GCU300。在使用TopsCC编译时,可以指定-arch agcu200进行编译,这样编译器会额外进行兼容性检查,并编译出在GCU210和GCU300都可以运行的代码。
# 编译产生只可以运行在GCU210上的程序
topscc -arch gcu210 source.cc
# 编译产生只可以运行在GCU300上的程序
topscc -arch gcu300 source.cc
# 编译产生可以运行在GCU210和GCU300上的程序
topscc -arch gcu210 -arch gcu300 source.cc
# 编译产生可以运行在GCU210和GCU300上的程序,且进行编译期兼容性检查
topscc -arch agcu200 source.cc
因为硬件架构还在快速演进,因此AGCU的兼容范围只限定在最近的两代硬件之间。如下图所示,针对AGCU200编译的代码,只能确保在GCU210和GCU300上运行;如果需要在未来的GCU400上运行,则需要以AGCU300为目标来编译代码,这可能需要对原有针对AGCU200的代码做部分修改。

图 12.1 AGCU的兼容范围¶
12.1. AGCU计算能力 (AGCU Compute Capability)¶
AGCU功能支持 (Feature Supported per AGCU Capability)¶
更新后AGCU 4.0的功能支持列表
Feature Support |
2.0 |
3.0 |
4.0 |
---|---|---|---|
子线程函数 |
No |
Partial |
Yes |
直接访问全局内存 |
No |
Partial |
Yes |
线程块共享DTE |
Yes |
Yes |
Yes |
线程私有DTE |
Yes |
Yes |
Yes |
线程本地DTE |
Yes |
Yes |
Yes |
子线程私有DTE |
N/A |
N/A |
Yes |
DTE支持融合操作 |
No |
Yes |
Yes |
DTE支持下采样操作 |
No |
Yes |
Yes |
GCU和AGCU技术参数(Technical Specifications per GCU & AGCU Capability)¶
下表中技术参数列的括号内的变量名,可以在调用topsGetDeviceProperties()
获得的结构体内访问。
技术参数 |
AGCU200 |
AGCU300 |
AGCU400 |
---|---|---|---|
线程网格中包含线程块的最大维度 |
3 |
3 |
3 |
在X维度上,线程网格中包含线程块的最大数量 (maxGridSize[0]) |
1024 |
2^16 - 1 |
2^16 - 1 |
在Y或Z维度上,线程网格中包含线程块的最大数量 (maxGridSize[1/2]) |
1024 |
2^8 - 1 |
2^8 - 1 |
线程块中包含线程的最大维度 |
3 |
3 |
3 |
在X或Y维度上,线程块中包含线程的最大数量 (maxThreadsDim[0/1]) |
12 |
12 |
6 |
在Z维度上,线程块中包含线程的最大数量 (maxThreadsDim[2]) |
12 |
12 |
6 |
线程块中包含线程的最大数量 (maxThreadPerBlock) |
12 |
12 |
6 |
线程中包含子线程的最大维度 |
不支持 |
不支持 |
3 |
在X或Y维度上,线程中包含子线程的最大数量 (maxSubthreadsDim[0/1]) |
不支持 |
不支持 |
8 |
在Z维度上,线程中包含子线程的最大数量 (maxSubthreadsDim[2]) |
不支持 |
不支持 |
8 |
线程中包含子线程的最大数量 (maxSubthreadsPerThread) |
不支持 |
不支持 |
8 |
默认向量宽度 |
128 B |
128 B |
512B |
单设备可驻留的最大线程网格数量 |
24 |
24 |
24 |
单个SIP可驻留的最大线程网格数量 (maxGridPerSip) |
1 |
1 |
1 |
单个SIP可驻留的最大线程块数量 (maxBlockPerSip) |
1 |
1 |
2 |
单个SIP可驻留的最大线程数量 (maxThreadPerSip) |
1 |
1 |
2 |
单个SIP可驻留的最大子线程数量 (maxSubthreadPerSip) |
1 |
1 |
8 |
单个SIC可驻留的最大线程数量 (maxThreadPerSic) |
12 |
12 |
12 |
每个线程的最大标量寄存器数量 |
32 |
32 |
32 |
每个线程的最大向量寄存器数量 |
32 |
32 |
32 |
每个线程的最大输入向量寄存器数量 |
32 |
32 |
不支持 |
每个线程的最大向量累积寄存器数量 (regsPerThread) |
1024 |
2048 |
768 |
每个子线程的最大向量累积寄存器数量 (regsPerSubthread) |
不支持 |
不支持 |
192 |
每个SIP的最大向量累积寄存器数量 (regsPerSip) |
1024 |
4096 |
768 |
每个线程的最大特殊矩阵寄存器数量 |
4 |
4 |
不支持 |
每个线程的最大堆栈容量 |
16 KiB |
16 KiB |
128 KiB |
每个核函数的最大常量数据段容量 (totalConstMem) |
10 KiB |
8 KiB |
8 KiB |
每个核函数的最大参数容量 |
4 KiB |
4 KiB |
4 KiB |
每个线程的最大本地内存容量 (maxLocalMemPerThread) |
1 MiB |
896 KiB |
896 KiB |
每个SIP的最大本地内存容量 (maxLocalMemPerSip) |
1 MiB |
1.5 MiB - 128B |
896 KiB |
每个线程块的最大共享内存容量 (maxSharedMemPerBlock) |
24 MiB - 32 KiB |
64 MiB |
6 MiB |
每个SIC的最大共享内存容量 (maxSharedMemPerSic) |
24 MiB - 32 KiB |
64 MiB |
6 MiB |
每个SIP的最大本地DTE VC数量 |
16 |
12 |
12 |
每个线程的最大本地DTE VC数量 |
16 |
12 |
12 |
每个SIC的最大共享DTE VC数量 |
32 |
16 |
16 |
每个线程的最大共享DTE VC数量 |
32 |
16 |
16 |
每个线程块的最大共享DTE VC数量 |
32 |
16 |
16 |
每个SIP的最大barrier数量 |
不支持 |
4 |
4 |
每个线程的最大barrier数量 |
不支持 |
4 |
4 |
每个SIC的最大barrier数量 |
不支持 |
16 |
16 |
每个线程块的最大barrier数量 |
不支持 |
4 |
4 |
每个线程网格的最大barrier数量 |
不支持 |
4 |
4 |
注意:使用下表中的硬件资源上限编写的程序,不一定可以兼容运行在下一代硬件上。
技术参数 |
GCU210 |
GCU300 |
GCU400 |
---|---|---|---|
每个线程的最大本地内存容量 (maxLocalMemPerThread) |
1 MiB |
1.5 MiB - 512 B |
896 KiB |
每个SIP的最大本地内存容量 (maxLocalMemPerSip) |
1 MiB |
1.5 MiB - 512 B |
896 KiB |
每个线程块的最大共享内存容量 (maxSharedMemPerBlock) |
24 MiB - 32 KiB |
64 MiB |
6 MiB |
每个SIC的最大共享内存容量 (maxSharedMemPerSic) |
24 MB - 32 KiB |
64 MB |
6 MB |
12.2. 二进制兼容 (Binary Compatibility)¶
直接针对具体硬件进行编译产生的二进制可执行文件不支持二进制兼容。例如,针对GCU210编译出的二进制文件无法直接运行在GCU300上,需要重新进行编译产生新的二进制可执行文件,才可以运行在GCU300上。
针对AGCU200编译产生的二进制可执行文件,可以同时运行在GCU210和GCU300上。这是推荐开发者使用的方式。
当TOPS软件包自身版本升级时,会尽量保持前后版本之间的接口二进制兼容,但并不能始终保证这一点。如果接口的二进制兼容被打破,会在对应版本的发布日志中说明。接口的二进制兼容被打破时,一般都是由于头文件中定义的某些结构体的大小发生的改变,这种情况下只需要重新进行编译即可。
12.3. 汇编指令兼容 (Assembly Compability)¶
从GCU210到GCU300,支持汇编指令兼容。GCU210核函数代码中的嵌入式汇编或者独立的汇编代码,不需要修改就可以编译成GCU300上的指令。