自动矩阵化
-foptimize-loops
为了提高SME指令在应用中的利用率,毕昇编译器加入了自动矩阵化能力,通过静态分析识别应用源码中存在的GEMM、SYR2K等典型计算模式,并获取行指标、列指标、维度等关键计算信息,在不影响程序正确性的前提下生成SME指令,提高程序性能。
使用示例如下:
1 2 | $ ulimit -s unlimited $ clang -mcpu=hip11 -O1 -foptimize-loops gemm.c //要求优化等级>=O1 |
自动矩阵化功能需要大约32MB的栈,若默认小于该值可通过ulimit命令配置。
代码示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 | void gemm(int M, int N, int K, float ALPHA, float *A, int lda, float *B, int ldb, float *C, int ldc) { int i, j, k; for(i = 0; i < M; ++i){ for(j = 0; j < N; ++j){ float sum = 0; for(k = 0; k < K; ++k){ sum += ALPHA * A[i * lda + k] * B[j + ldb * k]; } C[i + ldc * j] += sum; } } } |
-msrccode-tuning-level
该方法通过调用环境中的devkit工具,对编译命令中的源文件进行优化识别并生成优化后的源文件。 该选项有三个可选的参数,分别为sme,sve和all,代表了对源码进行自动优化的类别。
使用示例如下:
$ export PATH=/path/to/devkit:$PATH $ clang -msrccode-tuning-level=all test.c
回显信息中会包含每个源文件的优化报告和优化后文件的输出路径。
该选项依赖devkit工具,需要提前添加可用的devkit工具的执行路径到环境变量PATH中,并保证devkit工具的版本不低于25.3.0。建议保持使用最新版本的devkit工具。
该选项只会进行源码优化操作,不会实际执行任何编译操作。
关联选项一:-msrccode-tuning-aggressive
开启该选项时,会在优化源文件后直接使用优化后的源文件完成编译操作。
使用示例如下:
$ export PATH=/path/to/devkit:$PATH $ clang -msrccode-tuning-level=all -msrccode-tuning-aggressive test.c
关联选项二:-msrccode-tuning-config-json
开启该选项时,需要提供一个JSON文件,在对源文件进行优化时,会根据JSON文件中提供的行号来限制识别优化的代码范围。
使用示例如下:
$ export PATH=/path/to/devkit:$PATH $ clang -msrccode-tuning-level=all -msrccode-tuning-config-json=/path/to/yourjson.json test.c
JSON文件示例如下:
{
"/path/to/yourcode/file-1.c" : [[70, 76], [80, 86]],
"/path/to/yourcode/file-2.c" : [[50, 56]]
}
JSON文件的key为限定行号的源文件的绝对路径,value为限定的行号。
JSON文件中提供的源文件,如果不在编译命令中,不会对该文件进行优化操作;如果编译命令中存在的源文件,在JSON文件中没有提供限定行号,则会默认对整个源文件进行优化。
关联选项只有在开启-msrccode-tuning-level时才能生效,两个关联选项可以同时使用。