【问题标题】:Performance of Parallel computing is lower than No parallel computing in Python并行计算的性能低于 Python 中的无并行计算
【发布时间】:2021-03-13 13:51:05
【问题描述】:

我只是写了一个在 Numba 上处理列表和并行的示例,如下所示 Parallel 和 No Parallel:

平行

@njit(parallel=True)
def evaluate():
  n = 1000000
  a = [0]*n
  sum = 0
  for i in prange(n):
    a[i] = i*i
  for i in prange(n):
    sum += a[i]
  return sum

没有并行

def evaluate2():
  n = 1000000
  a = [0]*n
  sum = 0
  for i in range(n):
    a[i] = i*i
  for i in range(n):
    sum += a[i]
  return sum

并比较评估时间

t.tic()
print(evaluate())
t.toc()

结果:333332833333500000 经过的时间是 0.233338 秒。

t.tic()
print(evaluate2())
t.toc()

结果:333332833333500000 经过的时间是 0.195136 秒。

Full code can get from Colab

【问题讨论】:

  • 我以前从未使用过 numba,但我读到它最适合用于使用 numpy 数组的代码。您的示例使用了一个列表,该列表可以是一个数组numpy.zeros(n, dtype = int)。 nopython 模式上的 numba 文档建议它将列表转换为有效的非 Python 对象并返回(反射),这可能会占用时间。此外,a 列表是否必要?看起来你可以在没有它的情况下计算总和,只需 sum += i*i 代替
  • 您正在测量编译和运行时。只需测量第二次调用即可获取运行时。

标签: python numba parallels numba-pro


【解决方案1】:

答案是操作的数量仍然很少。当我将 n 更改为 100,000,000 时,性能发生了显着变化。

【讨论】:

  • 我认为你是对的。同样,我认为所做的操作非常轻量级(只有小数的乘法和加法)。如果操作更繁重,则可以预期并行化会有更大的改进。
【解决方案2】:

我还没有在 Numba 中尝试过。但是,当 CPU 用作非并行处理器而 GPU 用于并行处理时,这恰好发生在 Matlab 或其他编程语言中。处理小数据时,CPU的处理速度超过GPU,并行计算没有用处。并行处理只有在处理数据大小超过某个值时才有效。有一些基准可以向您展示并行处理何时有效。我读过论文,他们在代码中放置了开关,以便在处理过程中在 CPU 和 GPU 之间进行选择。用一个大数组尝试相同的代码并比较结果。

【讨论】:

  • 但我是在 Colab 上运行的,而不是在我的电脑上。 colab 是否在 GPU 上运行?
  • 根据docs@jit 仅在 CPU 上进行并行化,这比卸载到 GPU 的开销要少得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多