c++ - 更快的 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
解决方案
推荐阅读
- xml - 自动将 XML 解析为 Logstash
- oracle12c - 无法在 Oracle Data Integrator 中获得正确电子邮件地址的通知
- c# - c# elasticsearch 未知聚合类型 [multi_terms] 你的意思是 [rare_terms] 吗?
- java - org.apache.commons.cli CommandLineParser 没有保留传递的参数
- sql - 有没有办法在 SAS IF/THEN/DO 函数中嵌套 sql 语句?
- apache-camel - Apache Camel:多路由与多端点
- string - 数字格式 CultureInfo 自定义与 TryParse
- c - 如何链接静态库 .o 文件?
- sql-server - 将 Microsoft Access 查询切换到 SQL Server 的 ODBC 驱动程序 17 不返回任何记录
- html - Node.js将下载的pdf文件流转换为base64字符串导致错误