gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:51:38 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com