任何人都可以给出一个示例或链接到一个__builtin_prefetch在GCC 中使用的示例(或者通常只是asm指令prefetcht0)以获得实质性的性能优势吗?特别是,我希望这个例子符合以下标准:
__builtin_prefetch指令会导致性能下降.__builtin_prefetch用相应的内存访问替换指令会导致性能下降.也就是说,我想要最简短的示例,显示__builtin_prefetch执行无需管理就无法管理的优化.
我试图更多地了解 CPU 缓存如何影响性能。作为一个简单的测试,我将矩阵第一列的值与不同数量的总列数相加。
// compiled with: gcc -Wall -Wextra -Ofast -march=native cache.c
// tested with: for n in {1..100}; do ./a.out $n; done | tee out.csv
#include <assert.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
double sum_column(uint64_t ni, uint64_t nj, double const data[ni][nj])
{
double sum = 0.0;
for (uint64_t i = 0; i < ni; ++i) {
sum += data[i][0];
}
return sum;
}
int compare(void const* _a, void const* _b)
{
double const a = *((double*)_a);
double …Run Code Online (Sandbox Code Playgroud) 该内部函数导说,只有这么多关于void _mm_prefetch (char const* p, int i):
从包含地址p的内存中获取数据行到由locality hint i指定的缓存层次结构中的位置.
你能列出int i参数的可能值并解释它们的含义吗?
我发现_MM_HINT_T0,_MM_HINT_T1,_MM_HINT_T2,_MM_HINT_NTA和_MM_HINT_ENTA,但我不知道这是否是一个详尽的列表和它们的含义.
如果特定于处理器,我想知道他们在Ryzen和最新的英特尔酷睿处理器上做了什么.
某些CPU和编译器提供预取指令.例如:GCC文档中的 __builtin_prefetch .虽然GCC的文件中有评论,但它对我来说太短了.
我想知道,在prantice中,我们应该何时使用预取?有一些例子吗?谢谢!
prefetch ×3
cpu-cache ×2
optimization ×2
performance ×2
x86 ×2
arm ×1
assembly ×1
c ×1
c++ ×1
gcc ×1
intrinsics ×1
x86-64 ×1