Awesome
Goldilocks
Setup
Dependencies
sudo apt-get install libgtest-dev libomp-dev libgmp-dev libbenchmark-dev
For CUDA 12.3:
sudo apt install nvidia-driver-535
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3
Usage
Compile:
g++ tests/tests.cpp src/*.cpp -lgtest -lgmp -lomp -o test -g -Wall -pthread -fopenmp -mavx2 -L$(find /usr/lib/llvm-* -name "libomp.so" | sed 's/libomp.so//')
g++ benchs/bench.cpp src/*.cpp -lbenchmark -lomp -lpthread -lgmp -std=c++17 -Wall -pthread -fopenmp -mavx2 -L$(find /usr/lib/llvm-* -name "libomp.so" | sed 's/libomp.so//') -O3 -o bench
CUDA support
CUDA code is enabled with the flag __USE_CUDA__
.
To build the tests running only on CPU: make testscpu
.
To build the tests running on CPU+GPU: make testsgpu
.
Similarly for benchmarks: make benchcpu
and make benchgpu
.
The script configure.sh
finds the CUDA capability of the GPU installed on the host system and updates the file CudaArch.mk
which is used by the Makefile.
Profiling and Timers
Timers (similar to those in zkProver) can be enabled with the flag GPU_TIMING
.
Original Readme - Example of Usage
#include <iostream>
#include "src/goldilocks_base_field.hpp"
int main(int argc, char **argv)
{
Goldilocks::Element a = Goldilocks::fromU64(0xFFFFFFFF00000005ULL);
uint64_t b = Goldilocks::toU64(a);
Goldilocks::Element c = Goldilocks::fromString("6277101731002175852863927769280199145829365870197997568000");
std::cout << Goldilocks::toString(a) << " " << b << " " << Goldilocks::toString(c) << "\n";
return 0;
}