__builtin_prefetch 让我的代码更快。我需要在代码中做什么
__builtin_prefetch making it faster in my code. What I need to do in the code
在这个程序中
#include <stdio.h>
#include <stdint.h>
int main()
{
uint16_t *data=(uint16_t[]){1,2,3,4,5,6,7,8,9,10};
int mlen=10;
uint16_t partial=0;
__builtin_prefetch(data + 8);
while (mlen >0) {
partial += *(uint16_t *)data;
data += 1;
mlen -= 1;
}
return 0;
}
我正在使用 __builtin_prefetch(data + 8);
所以直到索引 8 将被提取到缓存中。但是我用
编译程序
gcc prefetcher.c -DDO_PREFETCH -o with-prefetch -std=c11 -O3
比这个慢
gcc prefetcher.c -o no-prefetch -std=c11 -O3
这是分别的输出
12401 L1-dcache-load-misses # 6.76% of all L1-dcache accesses
183459 L1-dcache-loads
0.000881880 seconds time elapsed
0.000952000 seconds user
0.000000000 seconds sys
这没有预取器
12991 L1-dcache-load-misses # 6.87% of all L1-dcache accesses
189161 L1-dcache-loads
0.001349719 seconds time elapsed
0.001423000 seconds user
0.000000000 seconds sys
我需要正确地做些什么才能让我的 __builtin_prefetch 代码 运行 更快
以上输出来自 perf progarm
What I need to do it correctly so my __builtin_prefetch code run faster
您需要删除 __builtin_prefetch
。它实际上是代码片段之间唯一不同的指令。编译器将您的整个代码优化为空操作,因为您的代码中没有副作用。
您的第一个代码片段被编译为:
main:
xor eax, eax
ret
当您的第二个代码编译为:
main:
xor eax, eax
prefetcht0 [rsp-24]
ret
例如,即使您执行 return partial
,编译器也能够在编译时计算出整个结果,并将整个程序缩减为 return <constant>
.
您可以使用 https://godbolt.org/ 轻松检查程序生成的程序集。
在这个程序中
#include <stdio.h>
#include <stdint.h>
int main()
{
uint16_t *data=(uint16_t[]){1,2,3,4,5,6,7,8,9,10};
int mlen=10;
uint16_t partial=0;
__builtin_prefetch(data + 8);
while (mlen >0) {
partial += *(uint16_t *)data;
data += 1;
mlen -= 1;
}
return 0;
}
我正在使用 __builtin_prefetch(data + 8);
所以直到索引 8 将被提取到缓存中。但是我用
gcc prefetcher.c -DDO_PREFETCH -o with-prefetch -std=c11 -O3
比这个慢
gcc prefetcher.c -o no-prefetch -std=c11 -O3
这是分别的输出
12401 L1-dcache-load-misses # 6.76% of all L1-dcache accesses
183459 L1-dcache-loads
0.000881880 seconds time elapsed
0.000952000 seconds user
0.000000000 seconds sys
这没有预取器
12991 L1-dcache-load-misses # 6.87% of all L1-dcache accesses
189161 L1-dcache-loads
0.001349719 seconds time elapsed
0.001423000 seconds user
0.000000000 seconds sys
我需要正确地做些什么才能让我的 __builtin_prefetch 代码 运行 更快
以上输出来自 perf progarm
What I need to do it correctly so my __builtin_prefetch code run faster
您需要删除 __builtin_prefetch
。它实际上是代码片段之间唯一不同的指令。编译器将您的整个代码优化为空操作,因为您的代码中没有副作用。
您的第一个代码片段被编译为:
main:
xor eax, eax
ret
当您的第二个代码编译为:
main:
xor eax, eax
prefetcht0 [rsp-24]
ret
例如,即使您执行 return partial
,编译器也能够在编译时计算出整个结果,并将整个程序缩减为 return <constant>
.
您可以使用 https://godbolt.org/ 轻松检查程序生成的程序集。