Sid*_*Bob 8 c++ shared memory-management const openmp
我猜测即使从openmp中的共享数据中读取也会导致一些并行开销,这取决于处理器架构(如果不同的内核有自己的缓存...),可能需要刷新缓存以确保没有其他cpu修改了阅读前的数据.
我是否正确地思考这个?
如果是这样,有没有办法告诉openmp(在intel编译器fwiw上)某些共享数据是不变的,所以不需要这样的缓存刷新?
如果答案是c ++ const,那么一旦程序在运行时通过某个点,有一种简单的方法可以将非常量数据转换为常量数据,而无需实际重新分配内存吗?
UPDATE
喔好吧.我现在记得const在这种情况下我得到的印象是好事:http: //www.akkadia.org/drepper/cpumemory.pdf,第6.4.1节.它与错误共享有关,其中与读写变量共享高速缓存行的只读变量会导致被读写变量标记为高速缓存行的代价.例如,链接文档建议使用gcc标记这些变量,__attribute__((section(something.else)))以确保它们存储在其他位置.
实际上,这与我自己的情况无关 - 大型数组和stl数据容器,其中读/写粒度将跨越许多高速缓存行,并且在任何情况下都从不同的内存池分配.所以这些将自然地位于不同的缓存行上.没问题!
我也在查看这个主题并找到了Oracle的一般性能建议:
如果并行区域中的SHARED变量由执行该区域的线程读取,但未被任何线程写入,则将该变量指定为FIRSTPRIVATE而不是SHARED.这样可以避免通过取消引用指针来访问变量,并避免缓存冲突.
Oracle OpenMP API用户指南 - 第7章 - 性能注意事项
在多个内核之间共享只读数据没有开销.对于使用它的所有核心,相同的数据副本将位于缓存中.
您将产生开销的唯一时间是其中一个核心写入共享数据.在这种情况下,您将产生(可能很大的)开销,因为写入将使该缓存行的所有其他副本无效并强制它们从内存或从不同的缓存中获取它.
换句话说,当有人更改数据时,缓存只会"刷新".没有定期的"清爽".
所以你的问题的答案是:你不必做任何事情.没有办法告诉OpenMP或硬件数据是否恒定,const除了语法之外没有任何影响.
| 归档时间: |
|
| 查看次数: |
4003 次 |
| 最近记录: |