【发布时间】:2018-05-25 01:18:03
【问题描述】:
我有一个由 ctypes 调用的 NASM 64 dll。该程序将两个 64 位整数相乘并返回一个 128 位整数,因此我使用的是 xmm SIMD 指令。它循环 10,000 次并将其结果存储在 malloc 创建的内存缓冲区中。
这是执行 SIMD 计算的 NASM 代码部分:
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 位。
Handling 128-bit integers with ctypes 有一篇文章处理传入但不传出的 128 位数组。
我的问题是:
-- 我应该使用 movdqa 或 movdqu 以外的指令吗?在众多 SIMD 指令中,这些似乎是最合适的。
-- Python 可以处理任意大小的整数,但显然 ctypes 不能。当没有大于 64 位的 ctypes 大小时,有什么方法可以使用 ctypes 中的 128 位整数?
【问题讨论】: