首页 > 解决方案 > 使用 numpy 并行计算多个图像

问题描述

我正在生成超级随机二进制图像,并且在一个 CPU 核心 atm 上执行此操作。由于我想生成数百万张图像,因此我需要在我的 CUDA GPU 上执行此操作。我认为 numba 是正确使用的工具,但它的哪些功能?我想在不同的 GPGPU 核心上计算每个图像,所以我在 CPU 上的主要进程应该只复制图像信息(基本上只有 id)并在 GPGPU 核心上并行生成尽可能多的图像。

我考虑过使用jit,但我不确定它是否适合我的需要,这就是为什么我想听听一些关于这个主题的专家。

代码很简单,我想并行执行

import numpy as np

def gen_img(id):
    np.random.seed(id)
    a = np.random.randint(2, size=(1080, 1080))
    return a

numba.jit适合我的需要吗?

标签: pythonparallel-processinggpunumba

解决方案


numba.jit适合我的需要吗?”

不。鉴于您的目标是高性能生产“公正” -[CONCURRENT]生成 1080 x 1080 位图的工作流程(随机 - 这是它自己的主题),python 和numba.jit-accelerated 代码都不会执行任何接近足够正确的低级 CUDA 优化代码的地方。

PRNG 产生的随机性的质量,基于集中调度的种子id——是这里的核心问题,而不是 GPU 托管的生产代码 + 一些文件 I/O。

在种子生成和 PRNG 生成之间实现高质量分布映射的问题id远远超出了 Stack Overflow Q/A 站点,属于密码学领域,而不是 PRNG 实现。如果对使用可组合为 CUDA 内核的智能、高质量 PRNG-s 感兴趣(即不依赖于 GPU 硬件的限制,不是很深(相当且通常没有发布的 PRNG 数字分布的属性,比较对于其他 PRNG-s,包括那些具有已发布源代码的)随机位向量,有很多帖子可以从这里开始。

使用足够正确的工具的灵感:

例如,可以直接从 shell 获取此类位图,具有适合硬件约束的任何程度的作业并行性,而无需调用 GIL 锁跳舞 Python 解释器:

$ seq 4096 | parallel --jobs 32 \
                      --bar      \
                      '(base64 -w0 /dev/urandom | head -c 145800 > random_data_1k80_1k80_1bit.{})'

使用正确的工具,将特定于文件格式的标头添加到原始数据或通过管道/套接字将原始数据发送到其他进程是简单而明显的。那不是很棒吗?


推荐阅读