以下细胞自动机的并行计算中是否需要互斥?
我认为在使用并行线程时,在向共享资源写入时总是建议使用互斥锁。
互斥锁大大降低了程序的速度,但是否需要它来确保2d数组(futureOcean
(中的数据保持安全/一致?
当互斥锁在写操作期间锁定futureOcean
时:
2 threads: 163.352990 seconds
5 threads: 515.739237 seconds
10threads: 1021.035517 seconds
不使用互斥:
2 threads: 65.817534 seconds
10threads: 93.822217 seconds
我正在实现一个细胞自动机模型,特别是鱼类、鲨鱼和海洋的模拟。
我有一个1000x600的二维数组,名为ocean
,显然代表了海洋。
以及另一个名为futureOcean
的1000x600 2d阵列,它将为currentGeneration + 1
存储每个单元的状态。
最初,ocean
填充有:
- 50%的水,即0值
- 25%的鱼,即正整数值
- 25%shark,即负整数值
处理单个生成涉及处理ocean
中每个单元格的规则。
每次我计算当前单元格的新值时,我都会将其未来值存储在第二个2d数组(futureOcean(中,与原始值位于ocean
内的row
/column
位置相同。因此,CCD_ 11中的每个小区每代只更新一次。
我这样做了20000次(几代人(。
如果在新一代的构建过程中仅读取Ocean
,则不存在潜在的竞争条件,也不需要锁定。多个线程可以毫无问题地从一个常量源进行读取。
如果futureOcean
中的每个位置只更新一次,则不存在对该位置的竞争写入,也不需要锁定。单个线程可以毫无问题地写入其他线程未触及的唯一位置。
然后,在开始新一代之前,您必须等待futureOcean
完全更新,以避免在它仍在写入时读取。
您可以通过将工作拆分为每个线程写入数组的一个连续部分来提高多线程性能。否则,多个线程可能会写入彼此靠近的位置。如果这种情况发生在一两条缓存线的距离内(x86/64处理器中为64到128字节(,则可能会重复使该内存段无效,并强制在多个核心缓存中重新加载。(参见虚假分享(