Ubuntu 下的内存速度(预期为 0.17)

Ubuntu 下的内存速度(预期为 0.17)

我编写了一个简单的程序来检查内存写入速度(附件),发现我的内存工作速度大约是预期速度的 1/6。

硬件是:联想 Legion 5 pro。处理器:带有 Radeon 显卡的 AMD® Ryzen 7 5800h。

内存:

DDR4-3200 (PC4-25600)
25600 MB/s Peak Transfer Rate
3200 Data transfers/second (in millions)
(3200*8=25600)

写入速度必须为 25.6 字节/纳秒。但我得到的结果是:

$ ./writetest64
testing RAM write speed
writing 8 bytes at a time
total 8192000000 bytes
1842506647 ns
speed: 4.44612 bytes/ns
speed: 4446116931 bytes/s
speed: 4446.12 Mbytes/s
speed: 555.765 M writes/s
done!

那是,556 M 数据传输而不是 3200 M 数据传输。 那是,慢 5.75 倍比标称 RAM 速度(DDR4-3200 为 3200 M 数据传输率/秒)更快。

发生了什么事?内存为什么这么慢?是否应该有某种驱动程序之类的?

我用来测试RAM写入速度的程序:

#include <stdio.h>
#include <iostream>
#include <chrono>

int main() {
    printf("testing RAM write speed\n");
    int WIDTH = 16000000;
    int HEIGHT = 64;
    int64_t* target = new int64_t[WIDTH*HEIGHT];

        {
            int from = 0;
            int to = WIDTH*HEIGHT;
            for (int j = from; j < to; j++) {
                    target[j] = 0;
            }
        }

    auto start = std::chrono::high_resolution_clock::now();

        {
            int from = 0;
            int to = WIDTH*HEIGHT;
            for (int j = from; j < to; j++) {
                    target[j] = j*2+1 + ((int64_t)j<<33);
            }
        }

    auto finish = std::chrono::high_resolution_clock::now();
    auto nanos = std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count();
    long total = WIDTH*HEIGHT*sizeof(target[0]);
    std::cout << "writing " << sizeof(target[0]) << " bytes at a time\n";
    std::cout << "total "<< total << " bytes\n";
    std::cout << nanos << " ns\n";
    std::cout << "speed: "<< ((double)total) / nanos << " bytes/ns\n";
    std::cout << "speed: "<< (total * 1000'000'000L) / nanos << " bytes/s\n";
    std::cout << "speed: "<< ((double)total * 1000L) / nanos << " Mbytes/s\n";
    std::cout << "speed: "<< ((double)WIDTH*HEIGHT * 1000L) / nanos << " M writes/s\n";
    printf("done!\n");
    return 0;
}

汇编:

g++ -O3 writetest64.cpp -o writetest64

GCC 版本:gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0

万一,

$ sudo lshw -c memory
...
  *-cache:0
       description: L1 cache
       physical id: 5
       slot: L1 - Cache
       size: 512KiB
       capacity: 512KiB
       clock: 1GHz (1.0ns)
       capabilities: pipeline-burst internal write-back unified
       configuration: level=1
  *-cache:1
       description: L2 cache
       physical id: 6
       slot: L2 - Cache
       size: 4MiB
       capacity: 4MiB
       clock: 1GHz (1.0ns)
       capabilities: pipeline-burst internal write-back unified
       configuration: level=2
  *-cache:2
       description: L3 cache
       physical id: 7
       slot: L3 - Cache
       size: 16MiB
       capacity: 16MiB
       clock: 1GHz (1.0ns)
       capabilities: pipeline-burst internal write-back unified
       configuration: level=3
  *-memory
       description: System Memory
       physical id: 23
       slot: System board or motherboard
       size: 16GiB
     *-bank:0
          description: SODIMM DDR4 Synchronous Unbuffered (Unregistered) 3200 MHz (0,3 ns)
          product: M471A1G44AB0-CWE
          vendor: Samsung
          physical id: 0
          serial: ***
          slot: DIMM 0
          size: 8GiB
          width: 64 bits
          clock: 3200MHz (0.3ns)
     *-bank:1
          description: SODIMM DDR4 Synchronous Unbuffered (Unregistered) 3200 MHz (0,3 ns)
          product: M471A1G44AB0-CWE
          vendor: Samsung
          physical id: 1
          serial: ***
          slot: DIMM 0
          size: 8GiB
          width: 64 bits
          clock: 3200MHz (0.3ns)

这里看起来奇怪的是clock: 1GHz (1.0ns)缓存和clock: 3200MHz (0.3ns)系统内存。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.3 LTS
Release:    22.04
Codename:   jammy
$ uname -a
Linux *** 5.15.0-94-generic #104-Ubuntu SMP Tue Jan 9 15:25:40 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

相关内容