Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error when calculating PFC with multiple threads #124

Open
HPShark opened this issue Jul 9, 2023 · 0 comments
Open

Error when calculating PFC with multiple threads #124

HPShark opened this issue Jul 9, 2023 · 0 comments

Comments

@HPShark
Copy link

HPShark commented Jul 9, 2023

I defined PFC pfc(AES_SECURITY); in the main function, And refer to the openMP library and threadmp.cpp to calculate pk = pfc.mult(g, s); with multiple threads:

//omp_set_num_threads(1);	// pass
omp_set_num_threads(2);	// error
#pragma omp parallel for
	for (int i = 0; i < 100; i++)
	{
		G1 pk;
		pk = pfc.mult(g, s);      // public key
		cout << pk.g << endl;
	}

but an error will be reported during execution, and the content of each error report is different. The following is the content of a certain error report:

MIRACL error from routine nres_modadd
              called from nres_modmult
              called from ecurve_add
              called from nres_modmult
              called from ecurve_add
              called from your program
Overflow - Number too big

I also tried other multithreading libraries, mutexes, and web frameworks (crow) to try parallel computing, but I still can't solve the problem of pfc parameter passing.

How should I use pfc functions such as pfc.hash_to_aes_key(), pfc.pairing(), pfc.hash_and_map(), etc. in multithreading? Thanks a lot!

I am using Visual Studio 2022 on Windows 11 to compile and execute the code through Debug-win32. The complete code of the main.cpp and mirdef.h files is as follows:

// main.cpp

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include<omp.h>
#define _CRT_SECURE_NO_WARNINGS

//security define
#define AES_SECURITY 128
#define MR_PAIRING_SSP
#include "pairing_1.h"
#include "ssp_pair.h"
#include "miracl.h"
#include "mirdef.h"
using namespace std;


int main()
{
	PFC pfc(AES_SECURITY);
	
	G1 g,pk;
	Big s;
	time_t seed;
	time(&seed);
	irand((long)seed);

	pfc.random(g);
	pfc.precomp_for_mult(g);	// precompute on fixed g
	pfc.random(s);				// mk=s


	//omp_set_num_threads(1);	// pass
	 omp_set_num_threads(2);	// error

#pragma omp parallel for
	for (int i = 0; i < 100; i++)
	{
		G1 pk;
		pk = pfc.mult(g, s);      // public key
		cout << pk.g << endl;
	}
}
// mirdef.h

#define MIRACL 32
#define MR_LITTLE_ENDIAN    /* This may need to be changed        */
#define mr_utype int
                            /* the underlying type is usually int *
                             * but see mrmuldv.any                */
#define mr_unsign32 unsigned int
                            /* 32 bit unsigned type               */
#define MR_IBITS      32    /* bits in int  */
#define MR_LBITS      32    /* bits in long */
#define MR_FLASH      52      
                            /* delete this definition if integer  *
                             * only version of MIRACL required    */
                            /* Number of bits per double mantissa */

#define mr_dltype __int64   /* ... or long long for Unix/Linux */
#define mr_unsign64 unsigned __int64

#define MAXBASE ((mr_small)1<<(MIRACL-1))


#define MR_OPENMP_MT
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant