首页 > 解决方案 > 更快的 RAM 吞吐量

问题描述

我知道 RAM 延迟可能是 100ns,但我想加快一个程序,它基本上只需要从一个巨大的 4GB 阵列中的随机位置读取。似乎可以通过管道进行读取,或者(因为我的完整程序也对 RAM 进行了一些写入),我很乐意从 RAM 中获取“旧位”并自己检查我最近没有更改这些位。

是否有任何解决方案可以获得更快的吞吐量?我愿意在汇编中编程,甚至更改我的硬件,但我的第一个希望是我可以通过 Visual Studio C++ 在标准 Intel/AMD 硬件上执行此操作。请在下面查看并测试我的简单程序 - 我想将读取时间从当前的 80ns 降低到 2ns!

(顺便说一下,如果我将 RAM 使用量从 4GB 减少到 16MB,时间会下降到 10ns。预计会有一些加速,但 8 倍是令人惊讶的。也许编译器正在使用一些 L2 缓存技巧......无论如何,10ns 仍然很远没有物理限制。)

C++ 代码:

#include "pch.h"
#include <iostream>
#include <chrono>     // just for execution time measurement

#define RANDOM_COUNT  ((unsigned long long) 1 << 24)
#define RAM_SIZE      ((unsigned long long) 1 << 29)
//#define FAST_MOD      % RAM_SIZE
#define FAST_MOD      & (RAM_SIZE-1)

int main()
{
    std::chrono::steady_clock::time_point t1, t2;
    unsigned long long *ram = new unsigned long long[RAM_SIZE]; memset(ram, 0, RAM_SIZE * sizeof(unsigned long long));
    for (unsigned long long i = 0; i < 10; i++) {
        unsigned long long      random = (  rand()*rand()*rand()  )  FAST_MOD;
        unsigned long long  odd_random = (2*rand()*rand()*rand()+1);
        unsigned long long         sum =  0;
        t1 = std::chrono::high_resolution_clock::now();
        for (unsigned long long j = 0; j < RANDOM_COUNT; j++) {
            sum += ram[random];
            random = (random + odd_random)  FAST_MOD;
        }
        t2 = std::chrono::high_resolution_clock::now();
        std::cout << "\nns per read :  " << (std::chrono::duration_cast<std::chrono::nanoseconds>(t2 - t1).count() / ((float)RANDOM_COUNT)) << "   0==" << sum;
    }
    delete[] ram;
}



输出:

ns per read :  83.8036   0==0
ns per read :  85.3504   0==0
ns per read :  85.3037   0==0
ns per read :  84.6396   0==0
ns per read :  78.5159   0==0
ns per read :  83.3926   0==0
ns per read :  85.8171   0==0
ns per read :  84.8495   0==0
ns per read :  85.7676   0==0
ns per read :  85.4356   0==0

标签: c++compiler-optimizationramlatencythroughput

解决方案


推荐阅读