- 主题:内存拷贝性能受哪些因素的影响
一台配置较高的服务器上memcpy的性能居然不如一台老旧的笔记本电脑,测试了拷贝不同大小字节的数据,最差的情况(4MB数据拷贝)居然差了4倍,400ms vs 100ms(循环500次总时间)。
服务器配置:2 * Intel Xeon 6242R + 4 * 8G DDR4 3200 ECC
笔记本配置:Intel i7-6820HQ + 2 * 8G DDR4 2133
系统都是win10。
结果有些出人意料。
--
FROM 101.228.56.*
测试程序是一样的,cpu主频,内存频率都是服务器比笔记本好,400ms是500次的总时间。
【 在 z16166 的大作中提到: 】
: memcpy的实现指令一样的话,是不是跟主频和cpu cache、内存工作频率有关。ECC的一般慢?
: 昨天正好测试了一下机械盘文件读取,三十多兆的文件首次读进内存也只要500多毫秒,第二次因为有文件缓存就只需要11毫秒 ,也就是内存拷贝30多兆要不了11毫秒
: 你这个4M就要400毫秒感觉夸张了,虽然带ECC
: ...................
--
FROM 101.228.56.*
using namespace std::chrono;
void Test(size_t size, size_t cpy_times)
{
printf("copy(size=%d bytes, loops=%d): ", size, cpy_times);
char* src = new char[size]();
char* dst = new char[size]();
auto p1 = high_resolution_clock::now();
for (int i = 0; i < cpy_times; ++i)
{
memcpy(dst, src, size);
}
auto p2 = high_resolution_clock::now();
printf("time: %d ms\n", duration_cast<milliseconds>(p2 - p1).count());
delete[] src;
delete[] dst;
}
int main(int argc, char* argv[])
{
Test(4096, 0x80000);
Test(8192, 0x40000);
Test(1024 * 500, 0x1000);
Test(1024 * 1024 * 1, 0x800);
Test(1024 * 1024 * 2, 0x400);
Test(1024 * 1024 * 4, 0x200);
Test(1024 * 1024 * 24, 0x100);
}
【 在 mountainlion 的大作中提到: 】
: 方便发测试代码看下吗
:
--
FROM 101.228.56.*
现在使用的是Windows系统,我查了一下,尝试使用VirtualAllocExNuma从同一个node分配内存,测试下来没有变化,不知道是否正确。
【 在 youwill 的大作中提到: 】
: 可能跨numa了,试试服务器上用numactl在单个socket上跑
: 发自「今日水木 on M2012K11AC」
--
FROM 101.228.56.*
按帖子里的试了一下memmove和手写的简易版的memcpy,没有效果。
手写的memcpy想想也不应该比调用api的快,毕竟会用各种指令集优化,他里面居然说有效果也是奇了怪。
【 在 z16166 的大作中提到: 】
: 这有个关于linux的同样问题,
: 它这个除了memcpy的指令实现不同(在你的windows上可能没这个问题,因为应该是同一个exe拿去跑server和workstation的),还提到了:
: stream store
: ...................
--
FROM 101.228.56.*
nt stream store和ermsb是什么
【 在 KillnCov (KillnCov) 的大作中提到: 】
: 不要怀疑你的测试结果。
--
FROM 101.228.56.*
没有,一直跑没太大变化
【 在 youwill (youwill) 的大作中提到: 】
: 那反过来故意跨numa变慢没有?注意cpu要和内存配合设置的,另外warmup因素有没有影响?
--
FROM 101.228.56.*
原因找到了,主要是双CPU导致的,4倍可能不是很准确,平均是1.5-2倍。
【 在 leadu (leadu) 的大作中提到: 】
: 找到问题了么?刚才顺手在一台azure Standard_B2s win2022的机器上跑了一下,时间是amd 5600的两倍,这个倒是正常的,毕竟Standard_B2s性能差不多是azure上最差的几种之一了
--
FROM 101.228.56.*