---
title: 选项 -fllc-allocate
description: "通过分析程序中主要的执行路径，对主路径上的循环进行访存的复用分析，计算排序出 TOP 的热数据，并插入预取指令将数据先分配至 LLC 中，减少 LLC miss。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/hgcc/hist-hgcc/kunpenghgcc_06_0047.html
sourcePath: /source/zh/kunpengdevkithistory/hgcc/hist-hgcc/kunpenghgcc_06_0047.html
indexId: 62e1df65b5be93902431b0fb6ee2cf5a408d1932cde3150adee0b7dc79bcedc571
---
# 选项 -fllc-allocate

#### 说明

通过分析程序中主要的执行路径，对主路径上的循环进行访存的复用分析，计算排序出 TOP 的热数据，并插入预取指令将数据先分配至 LLC 中，减少 LLC miss。


#### 使用方法

使能 LLC 特性，需开启 -O2 或以上优化等级，同时增加编译选项 -fllc-allocate。

其他相关接口：

| 选项 | 默认值 | 说明 |
| --- | --- | --- |
| \-param=mem\-access\-ratio=[0,100] | 20 | 循环内访存数对指令数的占比。 |
| \-param=mem\-access\-num=unsigned | 3 | 循环内访存数量。 |
| \-param=outer\-loop\-nums=[1,10] | 1 | 允许扩展的外层循环的最大层数。 |
| \-param=filter\-kernels=[0,1] | 1 | 是否针对循环做路径串联筛选。 |
| \-param=branch\-prob\-threshold=[50,100] | 80 | 高概率执行分支的概率阈值。 |
| \-param=prefetch\-offset=[1,999999] | 1024 | 预取偏移距离，一般为2的次幂。 |
| \-param=issue\-topn=unsigned | 1 | 预取指令个数。 |
| \-param=force\-issue=[0,1] | 0 | 是否执行强制预取，即静态模式。 |
| \-param=llc\-capacity\-per\-core=[0,999999] | 114 | 多分支预取下每个核平均分配的 LLC 容量。 |


#### 结果

测试用例如下：

```
#define N 100000

long
test (long *a, long *b, long *c, int n)
{
    long sum;
    for (int i = 0; i < n; i++)
    {
        c[i] = a[i] * b[i];
        sum += c[i] - a[i];
    }
    return sum;
}
```

测试命令：

```
gcc -O2 -fllc-allocate -S test.c -o test.s
```

图1 选项未打开

图2 选项已打开

启用该选项后，生成的汇编代码对str指令访问的数据在索引上增加1024位偏移，并提前预取至L3 Cache（鲲鹏920的LLC）中。
