这可能是一个非常基本和微不足道的问题。我经常在文献中看到系统尺寸在数值计算中被选为2的幂。例如,对于自旋晶格上的蒙特卡罗模拟,晶格尺寸通常选择为2 ^ 4 = 16,2 ^ 5 = 32,2 ^ 6 = 64等。
背后是否存在特定的科学原因(与二元操作或存储有关)?或者它只是一个常规问题?
感谢。
答案 0 :(得分:1)
我想这并不是一个普遍的原因,而是一些让人们喜欢它并习惯它的小事。
正如@PaulR在评论中已经说过的那样,有许多算法更喜欢两种尺寸的功率,最明显的是递归divide and conquer algorithms,其中两种尺寸的功率保证可以分割直到最终没有遇到数量不均的元素。这里有两个非常重要的示例:Fast Fourier Transform和quicksort。
使用两种问题大小的功能非常方便,并且总是可以将它们加倍或减半,这使得测试算法或其实现的规模如何。我经常将问题大小加倍,然后检查解决它需要多长时间。如果它需要两倍长,它看起来是线性的,四倍长似乎是二次的,25倍长应该在O(n ^ 4)和O(n ^ 5)之间。请注意,这可能实际上不会为无限问题大小重现理论缩放,因为您可能会有一个O(n ^ 3)组件,其中一个小的前因隐藏在O(n ^ 2)部分后面,该部分主导小问题大小。 / p>
Vector instructions是编写高效代码的重要组成部分,矢量大小是我所见过的总是2的幂,例如SSE中有4个浮点数,AVX中有8个浮点数,硬件制造商可能会在future中将其加倍。通过使用2的幂,您可以确定向量宽度总是除以问题大小,这可能会给您一点点性能,或者在您尚未实现边缘情况的情况下也可能很方便。
可能有更多的原因,但那些只是我头脑中的原因。哪些适用于您的旋转系统蒙特卡罗模拟是依赖于实现的,但我猜如果您使用单旋转翻转Metropolis,它只是第二个。
鉴于它有时可能有一些小的优点,而且一般来说只是方便,你也可以问一下是否有充分的理由不使用两种问题规模的权力。一个很好的理由肯定是测试你的边缘情况,但除此之外,我真的不能想到一个......