相关疑难解决方法(0)

测量缓存延迟

所以我试图用C测量L1,L2,L3缓存的延迟.我知道它们的大小,我觉得我从概念上理解如何做到这一点,但我遇到了我的实现问题.我想知道是否有一些其他硬件错综复杂如预取问题.

#include <time.h>
#include <stdio.h>
#include <string.h>

int main(){
    srand(time(NULL));  // Seed ONCE
    const int L1_CACHE_SIZE =  32768/sizeof(int);
    const int L2_CACHE_SIZE =  262144/sizeof(int);
    const int L3_CACHE_SIZE =  6587392/sizeof(int);
    const int NUM_ACCESSES = 1000000;
    const int SECONDS_PER_NS = 1000000000;
    int arrayAccess[L1_CACHE_SIZE];
    int arrayInvalidateL1[L1_CACHE_SIZE];
    int arrayInvalidateL2[L2_CACHE_SIZE];
    int arrayInvalidateL3[L3_CACHE_SIZE];
    int count=0;
    int index=0;
    int i=0;
    struct timespec startAccess, endAccess;
    double mainMemAccess, L1Access, L2Access, L3Access;
    int readValue=0;

    memset(arrayAccess, 0, L1_CACHE_SIZE*sizeof(int));
    memset(arrayInvalidateL1, 0, L1_CACHE_SIZE*sizeof(int));
    memset(arrayInvalidateL2, 0, L2_CACHE_SIZE*sizeof(int));
    memset(arrayInvalidateL3, 0, L3_CACHE_SIZE*sizeof(int));

    index = 0;
    clock_gettime(CLOCK_REALTIME, &startAccess); …
Run Code Online (Sandbox Code Playgroud)

c memory arrays performance caching

27
推荐指数
3
解决办法
1万
查看次数

编写程序以获取CPU缓存大小和级别

我想写一个程序来获取我的缓存大小(L1,L2,L3).我知道它的一般想法.

  1. 分配一个大阵列
  2. 每次访问不同大小的部分.

所以我写了一个小程序.这是我的代码:

#include <cstdio>
#include <time.h>
#include <sys/mman.h>

const int KB = 1024;
const int MB = 1024 * KB;
const int data_size = 32 * MB;
const int repeats = 64 * MB;
const int steps = 8 * MB;
const int times = 8;

long long clock_time() {
    struct timespec tp;
    clock_gettime(CLOCK_REALTIME, &tp);
    return (long long)(tp.tv_nsec + (long long)tp.tv_sec * 1000000000ll);
}

int main() {
    // allocate memory and lock
    void* map = mmap(NULL, (size_t)data_size, PROT_READ …
Run Code Online (Sandbox Code Playgroud)

c++ performance computer-architecture cpu-cache

9
推荐指数
1
解决办法
4967
查看次数

英特尔硬件上的商店缓冲区大小?什么是商店缓冲区?

英特尔优化手册似乎对存储缓冲区的数量存在于处理器的许多地方,但谈判没有谈存储缓冲区的大小.这是公共信息还是商店缓冲区的大小保留为微架构细节?

我正在研究的处理器主要是Broadwell和Skylake,但其他人的信息也不错.

另外,存储缓冲区究竟做了什么?

performance x86 assembly intel cpu-architecture

8
推荐指数
1
解决办法
717
查看次数

英特尔CPU缓存策略

我有一台带有2.50GHz处理器的Intel®Core™i5-2450M CPU的笔记本电脑。我在Ubuntu 12.04(x86_64)上,尝试查找有关我的处理器的信息。

我能够找到我一直在寻找的大多数信息

cat /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)

lscpu
Run Code Online (Sandbox Code Playgroud)

我还想找出在每个缓存级别上使用的缓存策略。是回写还是透写?

有什么工具可以用来查找此类信息?

提前致谢。

linux cpu policy caching

5
推荐指数
2
解决办法
4321
查看次数

VRAM已满时会发生什么?

我想知道当前处理VRAM资源分配的nvidia / AMD实现。

我们已经知道,当系统RAM已满时,操作系统会使用交换/虚拟内存,那么当涉及VRAM时,交换相当于什么?它们会退回到系统RAM或硬盘上吗?

我认为回退到系统RAM是合理的,但是从我的经验来看,视频游戏在视频存储空间不足时会严重落后(典型FPS的1/20),这使我怀疑它们正在使用系统RAM,因为我认为RAM不会使游戏滞后这么慢。

简而言之,我想知道当前的实现是什么以及导致游戏在内存不足的情况下滞后的最大瓶颈是什么。

memory graphics memory-management data-transfer vram

5
推荐指数
1
解决办法
1824
查看次数

有没有办法刷新与程序相关的整个CPU缓存?

x86-64平台上,CLFLUSH汇编指令允许刷新对应于给定地址的缓存行.相反,冲洗与特定地址的缓存,会有一种通过使其充满了虚拟的内容,以刷新整个高速缓存(或者相关程序的缓存中执行,或整个高速缓存),例如(或任何我不会意识到的其他方法):

  • 仅使用标准C++ 17?
  • 如有必要,使用标准C++ 17和编译器内在函数?

以下函数的内容是什么:(无论编译器优化如何,该函数都应该工作)?

void flush_cache() 
{
    // Contents
}
Run Code Online (Sandbox Code Playgroud)

c++ memory optimization assembly cpu-cache

3
推荐指数
1
解决办法
4042
查看次数