У меня есть NASM 64 dll, вызываемая ctypes.Программа умножает два 64-разрядных целых числа и возвращает 128-разрядное целое число, поэтому я использую инструкции xmm SIMD.Он перебирает 10000 раз и сохраняет результаты в буфере памяти, созданном malloc.
Вот часть кода NASM, в которой выполняются вычисления SIMD:
cvtsi2sd xmm0,rax
mov rax,[pcalc_result_0]
cvtsi2sd xmm1,rax
PMULUDQ xmm0,xmm1
lea rdi,[rel s_ptr] ; Pointer
mov rbp,qword[rdi]
mov rcx,[s_ctr]
;movdqa [rbp + rcx],xmm0
movdqu [rbp + rcx],xmm0
add rcx,16
Инструкция movdqa не работает (программа вылетает, даже если она собрана с align = 16)директива).Инструкция movdqu работает, но когда я возвращаю массив в ctypes, мне нужно преобразовать указатель возврата в 128-бит, но 128-битный тип данных ctypes отсутствует.Вот соответствующая часть кода ctypes:
CallName.argtypes = [ctypes.POINTER(ctypes.c_double)]
CallName.restype = ctypes.POINTER(ctypes.c_int64)
n0 = ctypes.cast(a[0],ctypes.POINTER(ctypes.c_int64))
n0_size = int(a[0+1] / 8)
x0 = n0[:n0_size]
, где x0 - возвращенный массив, преобразованный в пригодную для использования форму, но не в 128 бит.
В имеется пост * Обработка 128-битных целых чисел с помощью ctypes , который имеет дело с передачей, а не с выходом 128-битных массивов.
Мои вопросы:
- Должен ли я использовать инструкцию, отличную от movdqa или movdqu?Из многих инструкций SIMD они кажутся наиболее подходящими.
- Python может обрабатывать целые числа до любого произвольного размера, но, очевидно, ctypes не может.Есть ли способ использовать 128-битные целые числа из ctypes, если размер ctypes не превышает 64 бит?