python - 使用共享数组在 Python 中实现快速 FFT 的内存对齐

标签 python numpy multiprocessing fft memory-alignment

我编写了一个图像处理应用程序,它需要执行多项操作,并且必须尽可能实时地执行这些操作。 数据的获取及其处理在不同的进程中运行(主要是出于性能原因)。数据本身非常大(2MPix 16 位灰度图像)。

我可以按照这篇文章中的描述在进程之间共享数组: How do I pass large numpy arrays between python subprocesses without saving to disk? (我使用 numpy-shared 包中的 shmarray 脚本)。 我可以毫无问题地对这些数据执行提供的 Numpy FFT,但速度很慢。

调用 FFTW 可能会快得多,但为了充分利用它,我应该在内存对齐的数组上运行我的操作。

问题:有没有办法在进程之间创建和共享类似 Numpy 的数组,同时保证内存对齐?

最佳答案

获得正确对齐内存的最简单标准技巧是分配比需要多一点的内存,如果对齐错误则跳过前几个字节。如果我没记错的话,NumPy 数组总是 8 字节对齐,而 FFTW 需要 16 字节对齐才能发挥最佳性能。因此,您只需多分配 8 个字节,并在必要时跳过前 8 个字节。

编辑:这很容易实现。指向数据的指针在 ctypes.data 中以整数形式提供。 NumPy 数组的属性。使用移位 block 可以通过切片、查看为不同的数据类型和 reshape 来实现——所有这些都不会复制数据,而是重复使用相同的 buf。

要分配 64 位 float 的 16 字节对齐的 1000x1000 数组,我们可以使用以下代码:

m = n = 1000
dtype = numpy.dtype(numpy.float64)
nbytes = m * n * dtype.itemsize
buf = numpy.empty(nbytes + 16, dtype=numpy.uint8)
start_index = -buf.ctypes.data % 16
a = buf[start_index:start_index + nbytes].view(dtype).reshape(m, n)

现在,a是具有所需属性的数组,可以通过检查 a.ctypes.data % 16 来验证确实是0 .

关于python - 使用共享数组在 Python 中实现快速 FFT 的内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895787/

相关文章:

python - App Engine 数据存储区查询问题

python - 如何在具有最小、平均和最大面积值的 numpy 一维数组中选择子数组?

python - 如何处理Python中Spearman测试中的nan_policy错误

python - 如何正确使用 Python 中的 multiprocessing 模块?

python-3.x - 是否可以对 tkinter 进行多进程处理?

python - 我们正在使用tesseract进行平移OCR,但无法检测到名称和平移号等详细信息

python - 如何为列表中的每个唯一 val 添加计数

python - virtualenv中/path/to/env/bin/python setup.py和python setup.py的区别

python - 按列中的唯一值拆分 numpy 数组

使用管道的Python多进程非阻塞相互通信