FK20 CUDA
All Data Structures Namespaces Files Functions Variables Typedefs Macros
fr.cu
Go to the documentation of this file.
1 // bls12_381: Arithmetic for BLS12-381
2 // Copyright 2022-2023 Dag Arne Osvik
3 // Copyright 2022-2023 Luan Cardoso dos Santos
4 
5 #include <stdio.h>
6 
7 #include "fr.cuh"
8 
15 __device__ __host__ void fr_zero(fr_t &z) {
16  for (int i=0; i<4; i++)
17  z[i] = 0;
18 }
19 
26 __device__ __host__ void fr_one(fr_t &z) {
27  z[0] = 1;
28  for (int i=1; i<4; i++)
29  z[i] = 0;
30 }
31 
41 __device__ void fr_print(const char *s, const fr_t &x) {
42  fr_t t;
43  fr_cpy(t, x);
44  fr_reduce4(t);
45  printf("%s", s);
46  printf("%016lX%016lX%016lX%016lX\n", // dc
47 // printf("#x%016lx%016lx%016lx%016lx\n", // clisp compatible format
48 // printf("0x%016lx%016lx%016lx%016lx\n", // python compatible format
49  t[3], t[2], t[1], t[0]);
50 }
51 
59 __device__ __host__ void fr_fromUint64(fr_t &z, const uint64_t *x) {
60  z[0] = x[0];
61  z[1] = x[1];
62  z[2] = x[2];
63  z[3] = x[3];
64 }
65 
76 __device__ void fr_toUint64(const fr_t &x, uint64_t *z) {
77  fr_t t;
78  fr_cpy(t, x);
79  fr_reduce4(t);
80 
81  z[0] = x[0];
82  z[1] = x[1];
83  z[2] = x[2];
84  z[3] = x[3];
85 }
86 
99 __global__ void fr_eq_wrapper(uint8_t *eq, int count, const fr_t *x, const fr_t *y) {
100 
101  unsigned tid = 0; tid += blockIdx.z;
102  tid *= gridDim.y; tid += blockIdx.y;
103  tid *= gridDim.x; tid += blockIdx.x;
104  tid *= blockDim.z; tid += threadIdx.z;
105  tid *= blockDim.y; tid += threadIdx.y;
106  tid *= blockDim.x; tid += threadIdx.x;
107 
108  unsigned step = gridDim.z * gridDim.y * gridDim.x
109  * blockDim.z * blockDim.y * blockDim.x;
110 
111  for (unsigned i=tid; i<count; i+=step)
112  eq[i] = fr_eq(x[i], y[i]);
113 }
114 
115 // vim: ts=4 et sw=4 si
__device__ __host__ void fr_fromUint64(fr_t &z, const uint64_t *x)
Converts from uint64_t[4] to a residue modulo r, without reduction.
Definition: fr.cu:59
__device__ void fr_print(const char *s, const fr_t &x)
prints the canonical representation of x to STDOUT.
Definition: fr.cu:41
__global__ void fr_eq_wrapper(uint8_t *eq, int count, const fr_t *x, const fr_t *y)
Checks equality of two arrays of fr_t, element wise, and store in a byte array.
Definition: fr.cu:99
__device__ __host__ void fr_zero(fr_t &z)
Sets the value of z to zero.
Definition: fr.cu:15
__device__ void fr_toUint64(const fr_t &x, uint64_t *z)
Converts fr_t to uint64_t[4].
Definition: fr.cu:76
__device__ __host__ void fr_one(fr_t &z)
Sets the value of z to one.
Definition: fr.cu:26
__device__ bool fr_eq(const fr_t &x, const fr_t &y)
Compares two residues modulo r.
Definition: fr_eq.cu:13
uint64_t fr_t[4]
Subgroup element stored as a 256-bit array (a 4-element little-endian array of uint64_t)....
Definition: fr.cuh:24
__device__ __host__ void fr_cpy(fr_t &z, const fr_t &x)
Copy from x into z.
Definition: fr_cpy.cu:14
__device__ void fr_reduce4(fr_t &z)
Reduced the value in fr_t to the field modulus.
Definition: fr_reduce4.cu:16