【发布时间】:2021-03-17 09:09:31
【问题描述】:
如果 GPU 真的能够并行计算代码。这个排序算法一定是正确的。
- 创建二维比较矩阵
O(n)
values = [ 3, 1, 2 ]
# 3 1 2
comparisonMatrix = [ [ 0, 1, 1 ], # 3
[ 0, 0, 0 ], # 1
[ 0, 1, 0 ]] # 2
# Done on GPU
comparisonMatrix[rowIdx][columnIdx] = values[rowIdx] > values[columnIdx]
- 计算行总和
O(n)
rowSums = [[ 1 ], # 3
[ 0 ], # 1
[ 2 ]] # 2
# Done on GPU
rowSums[rowIds] = comparisonMatrix[rowsIds][all]
- 使用
rowSums数组作为索引将初始values映射到sortedArray
O(1)
sortedValues = [ 1, 2, 3 ]
# Done on GPU
sortedValues[rowIdx] = values[rowSums[rowIdx]]
总计:O(n + n + 1) = O(n)
反论点:
GPU 的核心数量有限,因此迭代数组的大 O 是 O(n/NUM_CORES) 而不是 O(1)。但是由于硬件不应该包含在数学中,我们应该假设 NUM_CORES 为 1 或无穷大。无限会导致该算法正常,而假设 1 会导致 GPU 对复杂性没有数学影响。
注意事项:
这不是一个合理的算法,因为内存是 O(n^2),它更像是一个证明。
值都是不同的,否则会导致两个 rowSum 相等。
虽然有一些方法可以更快地完成这些子步骤,但我还是坚持使用最严格的方法。
【问题讨论】:
标签: algorithm sorting math gpu big-o