Самый простой стандартный прием для получения правильно выровненной памяти - выделить немного больше, чем нужно, и пропустить первые несколько байтов, если выравнивание неверно.Если я правильно помню, массивы NumPy всегда будут выровнены по 8 байтов, а FFTW требует 16-байтового выравнивания для лучшей работы.Таким образом, вы просто выделите на 8 байтов больше, чем нужно, и пропустите первые 8 байтов, если необходимо.
Редактировать : Это довольно просто реализовать.Указатель на данные доступен в виде целого числа в атрибуте ctypes.data
массива NumPy.Использование сдвинутого блока может быть достигнуто путем нарезки, просмотра в качестве другого типа данных и изменения формы - все это не будет копировать данные, а скорее будет использовать один и тот же буфер.
Для выделения 16-байтового выровненного 1000x1000массив 64-битных чисел с плавающей запятой, мы могли бы использовать этот код:
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
.