cuElim/include/gfp/gfp_header.cuh
2024-09-19 15:59:53 +08:00

50 lines
1.1 KiB
Plaintext

#ifndef GFP_HEADER_CUH
#define GFP_HEADER_CUH
#include "../header.cuh"
namespace gfp
{
using gfp_t = uint32_t;
static const gfp_t gfprime = 65521;
static const gfp_t gfp_zero = (gfp_t)0;
static const gfp_t gfp_one = (gfp_t)1;
static const gfp_t gfp_fullmask = (gfp_t)0xFF'FF;
__managed__ gfp_t gfp_inv_table[gfprime];
void init_inv_table()
{
gfp_inv_table[0] = 0;
gfp_inv_table[1] = 1;
for (int i = 2; i < gfprime; ++i)
{
gfp_inv_table[i] = (gfprime - gfprime / i) * gfp_inv_table[gfprime % i] % gfprime;
}
}
gfp_t gfp_inv(gfp_t a)
{
return gfp_inv_table[a];
}
__host__ __device__ inline size_t offset4(size_t idx)
{
return idx << 2;
}
__host__ __device__ inline size_t get4(gfp_t src, size_t idx)
{
return (src >> offset4(idx)) & 0xF;
}
// 确保set8对应位置的值为0
__host__ __device__ inline void set4(gfp_t &dst, size_t src, size_t idx)
{
dst |= (gfp_t)src << offset4(idx);
}
}
#endif