我想在我的C代码中使用Intel的PCLMULQDQ指令和内联汇编来乘以两个多项式,这两个多项式是GF(2 ^ n)中的元素。编译器是GCC 4.8.1。 多项式存储在uint32_t(6个字段大)的数组中。
我已经检查了网络如何正确使用PCLMULQDQ指令或CLMUL指令集,但没有找到任何好的文档。
我真的很感激C中的一个简单例子,以及如何将两个简单多项式与指令相乘。有人知道怎么做吗?
除了有任何先决条件(有能力的处理器除外),如包含库,编译器选项等。
答案 0 :(得分:0)
我已经找到了解决方案。因此,记录:
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;
}
}
}
我认为可以为pclmulqdq使用64位寄存器,但我无法找到如何使用内联汇编程序。有人知道吗?
尽管如此,内在函数也可以做同样的事情。 (如果你想要代码只是问。)
此外,如果您知道阵列的大小t,可以使用Karatsuba进一步优化计算。