python - 使用 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
适合我的需要吗?
解决方案
问:“
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.{})'
使用正确的工具,将特定于文件格式的标头添加到原始数据或通过管道/套接字将原始数据发送到其他进程是简单而明显的。那不是很棒吗?
推荐阅读
- java - 用于登录基于 Web 的应用程序的 Servlet 过滤器
- ios - 如何放入 Info.plist 2
CFBundleURLTypes - apache-spark-sql - 使用 Spark 在 HDFS 中将数据帧保存为镶木地板时数据量激增
- javascript - this.setState() 在本机反应中无法正常工作
- php - 如何限制共享主机上的 PHP 代码文件系统操作?
- ruby - 捆绑安装不起作用:Bundler::HTTPError 无法从 rubygems.org 获取规范
- flutter - 如果正文有两个脚手架,如何关闭应用程序页面
- xpath - 下一页的 Xpath - Scrapy
- javascript - React 防止焦点窃取 onClick
- python - 如何在 Heroku 中运行 UVICORN?