鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

自动矩阵化

-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时才能生效,两个关联选项可以同时使用。