我一直在阅读CUDA和OpenCL的编程指南,但是我无法理解什么是银行冲突。他们只是简单地介绍了如何解决这个问题,没有详细解释这个主题本身。有人可以帮我理解吗?我对于帮助是在CUDA/OpenCL的上下文中还是在计算机科学中的银行冲突方面都没有偏好。
Bank | 1 | 2 | 3 | ... | 16 |
Address | 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | ... | 60 61 62 63 |
Address | 64 65 66 67 | 68 69 70 71 | 72 73 74 75 | ... | ... |
...
可以并行访问的共享内存被分成了模块(也称为bank)。如果两个内存地址在同一个bank中,那么就会发生bank冲突,此时访问将串行进行,失去了并行访问的优势。
int arr[512][512];
for ( j = 0; j < 512; j++ ) // outer loop
for ( i = 0; i < 512; i++ ) // inner loop
arr[i][j] = 2 * arr[i][j]; // column major processing
通常,编译器通过对数组进行缓冲或使用素数个元素来避免这种问题。
(CUDA 银行冲突) 希望这能帮到你.. 这是非常好的解释...
http://en.wikipedia.org/wiki/Memory_bank
以及
http://mprc.pku.cn/mentors/training/ISCAreading/1989/p380-weiss/p380-weiss.pdf
从这个页面,您可以找到有关存储器银行的详细信息。 但是与@Grizzly所说的有些不同。 在这个页面上,银行是这样的:
银行 1 2 3
地址|0、3、6...| |1、4、7...| |2、5、8...|
希望这能帮到您。