gpt4 book ai didi

c - 如何防止编译器优化内存访问基准 read() vs mmap() 性能?

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:02 26 4
gpt4 key购买 nike

我想对读取 10GB 数据的 C 程序的 read() 与 mmap() 性能进行基准测试。如果我已经将数据读取或映射到缓冲区,应该怎么做才能确保数据确实被读取了?

目前我在每个单独的 read() 之后和一个 mmap() 操作之后使用以下函数来确保数据确实在内存中:

void use_data(void *data, size_t length) {
volatile int c = 0;
for (size_t i = 0; i < length; i++) {
c += *((char *) data + i);
}
}

但是,我觉得这甚至可能会引入开销?甚至可以区分 read() 和 mmap():

在 read() 的情况下,我认为不需要明确的数据访问,因为 read() 调用无论如何都会将数据复制到缓冲区。然而,在 mmap() 的情况下,我认为需要执行某种总结/计数以使内核加载每一页。

有什么建议吗?

最佳答案

您不需要为处理的每个字节访问 volatile 变量。将所有字节汇总到本地。然后,将总和写入 volatile 变量。

事实上,您不需要 volatile 变量。您可以使用编译器无法证明不需要的任何不透明接收器。将总和写入临时文件也能保证正常工作。

请注意,这不仅仅是让编译器合作的技巧。这保证触及每个字节(因为它可能会影响结果)。外部 IO 需要结果。这不能在标准下被优化掉。

如果对齐允许,以更大的单位求和,例如 32 或 64 位。使用无符号类型以避免 UB 溢出。您希望受内存/IO 限制,而不是 ALU 限制。您可以通过使用多个本地累加器变量对多个独立流求和来创建指令级并行性。

关于c - 如何防止编译器优化内存访问基准 read() vs mmap() 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26871638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com