内存访问与内存复制
memory access vs. memory copy
我正在用C++编写一个应用程序,该应用程序需要从许多线程多次从同一内存中只读。我的问题是,从性能的角度来看,复制每个线程的内存或为所有线程提供相同的指针并让所有线程访问相同的内存会更好。
谢谢
从您提供的有关目标系统等的少量信息中没有明确的答案,但是在普通PC上,最快的可能是不复制。
复制速度可能很慢的一个原因是,如果数据区域很大,可能会导致缓存未命中。普通 PC 会在线程之间非常有效地缓存对同一数据区域的只读访问,即使这些线程碰巧在不同的内核上运行。
英特尔为其缓存方法明确列出的优势之一是"为在共享缓存的不同内核上运行的线程提供更多数据共享机会"。 也就是说,他们鼓励一种实践,您不必对线程进行编程来显式缓存数据,CPU 会为您完成。
由于您特别提到了许多线程,因此我假设您至少有一个多插槽系统。通常,内存插槽与处理器插槽相关联。也就是说,一个处理器"最接近"自己的内存库,需要与其他处理器通信记忆控制器才能访问其他内存库上的数据。(这里的处理器是指插槽中的物理东西)
分配数据时,通常使用首次写入策略来确定将在哪些内存上分配数据,这意味着它可以比其他处理器更快地访问数据。
因此,至少对于多个处理器(不仅仅是多个内核),至少为每个处理器分配一个副本应该会提高性能。确保使用每个处理器/线程而不是从主线程分配/复制数据(以利用首次写入策略)。您还需要确保线程不会在处理器之间迁移,因为这样您可能会失去与内存的紧密连接。
我不确定复制单个处理器上每个线程的数据如何影响性能,但我想不复制可以提高共享内核之间共享的更高级别缓存内容的能力。
在任何情况下,都要根据实际测量结果进行基准测试和决定。
- C#中等价的C++内存复制
- 坚持将双指针管理的内存复制到二维数组
- OpenCL 将字符从全局内存复制到本地内存
- 内存C++复制是否将内存地址复制到另一个阵列
- 将内存复制到结构时,exc_bad_access
- 动态内存复制是如何工作的
- Cuda-从设备全局内存复制到纹理内存
- 使用动态内存复制类
- 将内存复制到标准::复制
- 通过指针的内存复制有时会丢失数据
- 内存访问与内存复制
- 使用汇编代码从内存复制到c++中的寄存器
- 执行 SSE 内存复制导致的堆损坏 - CRT 检查找不到任何内容
- 内存复制导致偏移量
- 如何将图像从全局内存复制到openCL的本地内存
- 从cuda 3D内存复制到线性内存:复制的数据不是我所期望的
- 使用内存复制对象时出现双自由或损坏错误
- c++内存复制结构体到字节数组中
- 使用内存复制对象数组
- 将原始数据从内存复制到文件(cuda)