我已經找到了解決方案。因此備案:
void f2m_intel_mult(
uint32_t t, // length of arrays A and B
uint32_t *A,
uint32_t *B,
uint32_t *C
)
{
memset(C, 0, 2*t*sizeof(uint32_t));
uint32_t offset = 0;
union{ uint64_t val; struct{uint32_t low; uint32_t high;} halfs;} prod;
uint32_t i;
uint32_t j;
for(i=0; i<t; i++){
for(j=0; j<t; j++){
prod.halfs.low = A[i];
prod.halfs.high = 0;
asm ("pclmulqdq %2, %1, %0;"
: "+x"(prod.val)
: "x"(B[j]), "i"(offset)
);
C[i+j] = C[i+j]^prod.halfs.low;
C[i+j+1] = C[i+j+1]^prod.halfs.high;
}
}
}
我認爲這是可能使用64位寄存器pclmulqdq,但我無法找出如何得到這個與內聯彙編工作。有人知道嗎?
儘管如此,也可以對intrinsics做同樣的事情。 (如果你想要的代碼只是問)
此外,如果你知道數組的大小t,可以用Karatsuba進一步優化計算。
快速搜索yielded http://download-software.intel.com/sites/default/files/article/165685/clmul-wp-rev-2.01-2012-09-21.pdf –