charm-crypto-framework 0.61.1__cp313-cp313-macosx_10_13_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- charm/__init__.py +5 -0
- charm/adapters/__init__.py +0 -0
- charm/adapters/abenc_adapt_hybrid.py +90 -0
- charm/adapters/dabenc_adapt_hybrid.py +145 -0
- charm/adapters/ibenc_adapt_hybrid.py +72 -0
- charm/adapters/ibenc_adapt_identityhash.py +80 -0
- charm/adapters/kpabenc_adapt_hybrid.py +91 -0
- charm/adapters/pkenc_adapt_bchk05.py +121 -0
- charm/adapters/pkenc_adapt_chk04.py +91 -0
- charm/adapters/pkenc_adapt_hybrid.py +98 -0
- charm/adapters/pksig_adapt_naor01.py +89 -0
- charm/config.py +7 -0
- charm/core/__init__.py +0 -0
- charm/core/benchmark/benchmark_util.c +353 -0
- charm/core/benchmark/benchmark_util.h +61 -0
- charm/core/benchmark/benchmarkmodule.c +476 -0
- charm/core/benchmark/benchmarkmodule.h +162 -0
- charm/core/benchmark.cpython-313-darwin.so +0 -0
- charm/core/crypto/AES/AES.c +1464 -0
- charm/core/crypto/AES.cpython-313-darwin.so +0 -0
- charm/core/crypto/DES/DES.c +113 -0
- charm/core/crypto/DES.cpython-313-darwin.so +0 -0
- charm/core/crypto/DES3/DES3.c +26 -0
- charm/core/crypto/DES3.cpython-313-darwin.so +0 -0
- charm/core/crypto/__init__.py +0 -0
- charm/core/crypto/cryptobase/XOR.c +80 -0
- charm/core/crypto/cryptobase/_counter.c +496 -0
- charm/core/crypto/cryptobase/_counter.h +54 -0
- charm/core/crypto/cryptobase/block_template.c +900 -0
- charm/core/crypto/cryptobase/block_template.h +69 -0
- charm/core/crypto/cryptobase/cryptobasemodule.c +220 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt.h +90 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_argchk.h +44 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_cfg.h +186 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_cipher.h +941 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_custom.h +556 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_des.c +1912 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_hash.h +407 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_mac.h +496 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_macros.h +435 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_math.h +534 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_misc.h +103 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_pk.h +653 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_pkcs.h +90 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_prng.h +199 -0
- charm/core/crypto/cryptobase/stream_template.c +271 -0
- charm/core/crypto/cryptobase/strxor.c +229 -0
- charm/core/crypto/cryptobase.cpython-313-darwin.so +0 -0
- charm/core/engine/__init__.py +5 -0
- charm/core/engine/protocol.py +293 -0
- charm/core/engine/util.py +174 -0
- charm/core/math/__init__.py +0 -0
- charm/core/math/elliptic_curve/ecmodule.c +1986 -0
- charm/core/math/elliptic_curve/ecmodule.h +230 -0
- charm/core/math/elliptic_curve.cpython-313-darwin.so +0 -0
- charm/core/math/elliptic_curve.pyi +63 -0
- charm/core/math/integer/integermodule.c +2539 -0
- charm/core/math/integer/integermodule.h +145 -0
- charm/core/math/integer.cpython-313-darwin.so +0 -0
- charm/core/math/integer.pyi +76 -0
- charm/core/math/pairing/miracl/miracl_config.h +37 -0
- charm/core/math/pairing/miracl/miracl_interface.h +118 -0
- charm/core/math/pairing/miracl/miracl_interface2.h +126 -0
- charm/core/math/pairing/miracl/pairingmodule2.c +2094 -0
- charm/core/math/pairing/miracl/pairingmodule2.h +307 -0
- charm/core/math/pairing/pairingmodule.c +2230 -0
- charm/core/math/pairing/pairingmodule.h +241 -0
- charm/core/math/pairing/relic/pairingmodule3.c +1853 -0
- charm/core/math/pairing/relic/pairingmodule3.h +233 -0
- charm/core/math/pairing/relic/relic_interface.c +1337 -0
- charm/core/math/pairing/relic/relic_interface.h +217 -0
- charm/core/math/pairing/relic/test_relic.c +171 -0
- charm/core/math/pairing.cpython-313-darwin.so +0 -0
- charm/core/math/pairing.pyi +69 -0
- charm/core/utilities/base64.c +248 -0
- charm/core/utilities/base64.h +15 -0
- charm/schemes/__init__.py +0 -0
- charm/schemes/abenc/__init__.py +0 -0
- charm/schemes/abenc/abenc_accountability_jyjxgd20.py +647 -0
- charm/schemes/abenc/abenc_bsw07.py +146 -0
- charm/schemes/abenc/abenc_ca_cpabe_ar17.py +684 -0
- charm/schemes/abenc/abenc_dacmacs_yj14.py +298 -0
- charm/schemes/abenc/abenc_lsw08.py +159 -0
- charm/schemes/abenc/abenc_maabe_rw15.py +236 -0
- charm/schemes/abenc/abenc_maabe_yj14.py +297 -0
- charm/schemes/abenc/abenc_tbpre_lww14.py +309 -0
- charm/schemes/abenc/abenc_unmcpabe_yahk14.py +223 -0
- charm/schemes/abenc/abenc_waters09.py +144 -0
- charm/schemes/abenc/abenc_yct14.py +208 -0
- charm/schemes/abenc/abenc_yllc15.py +178 -0
- charm/schemes/abenc/ac17.py +248 -0
- charm/schemes/abenc/bsw07.py +141 -0
- charm/schemes/abenc/cgw15.py +277 -0
- charm/schemes/abenc/dabe_aw11.py +204 -0
- charm/schemes/abenc/dfa_fe12.py +144 -0
- charm/schemes/abenc/pk_hve08.py +179 -0
- charm/schemes/abenc/waters11.py +143 -0
- charm/schemes/aggrsign_MuSig.py +150 -0
- charm/schemes/aggrsign_bls.py +267 -0
- charm/schemes/blindsig_ps16.py +654 -0
- charm/schemes/chamhash_adm05.py +113 -0
- charm/schemes/chamhash_rsa_hw09.py +100 -0
- charm/schemes/commit/__init__.py +0 -0
- charm/schemes/commit/commit_gs08.py +77 -0
- charm/schemes/commit/commit_pedersen92.py +53 -0
- charm/schemes/encap_bchk05.py +62 -0
- charm/schemes/grpsig/__init__.py +0 -0
- charm/schemes/grpsig/groupsig_bgls04.py +114 -0
- charm/schemes/grpsig/groupsig_bgls04_var.py +115 -0
- charm/schemes/hibenc/__init__.py +0 -0
- charm/schemes/hibenc/hibenc_bb04.py +105 -0
- charm/schemes/hibenc/hibenc_lew11.py +193 -0
- charm/schemes/ibenc/__init__.py +0 -0
- charm/schemes/ibenc/clpkc_rp03.py +119 -0
- charm/schemes/ibenc/ibenc_CW13_z.py +168 -0
- charm/schemes/ibenc/ibenc_bb03.py +94 -0
- charm/schemes/ibenc/ibenc_bf01.py +121 -0
- charm/schemes/ibenc/ibenc_ckrs09.py +120 -0
- charm/schemes/ibenc/ibenc_cllww12_z.py +172 -0
- charm/schemes/ibenc/ibenc_lsw08.py +120 -0
- charm/schemes/ibenc/ibenc_sw05.py +238 -0
- charm/schemes/ibenc/ibenc_waters05.py +144 -0
- charm/schemes/ibenc/ibenc_waters05_z.py +164 -0
- charm/schemes/ibenc/ibenc_waters09.py +107 -0
- charm/schemes/ibenc/ibenc_waters09_z.py +147 -0
- charm/schemes/joye_scheme.py +106 -0
- charm/schemes/lem_scheme.py +207 -0
- charm/schemes/pk_fre_ccv11.py +107 -0
- charm/schemes/pk_vrf.py +127 -0
- charm/schemes/pkenc/__init__.py +0 -0
- charm/schemes/pkenc/pkenc_cs98.py +108 -0
- charm/schemes/pkenc/pkenc_elgamal85.py +122 -0
- charm/schemes/pkenc/pkenc_gm82.py +98 -0
- charm/schemes/pkenc/pkenc_paillier99.py +118 -0
- charm/schemes/pkenc/pkenc_rabin.py +254 -0
- charm/schemes/pkenc/pkenc_rsa.py +186 -0
- charm/schemes/pksig/__init__.py +0 -0
- charm/schemes/pksig/pksig_CW13_z.py +135 -0
- charm/schemes/pksig/pksig_bls04.py +87 -0
- charm/schemes/pksig/pksig_boyen.py +156 -0
- charm/schemes/pksig/pksig_chch.py +97 -0
- charm/schemes/pksig/pksig_chp.py +70 -0
- charm/schemes/pksig/pksig_cl03.py +150 -0
- charm/schemes/pksig/pksig_cl04.py +87 -0
- charm/schemes/pksig/pksig_cllww12_z.py +142 -0
- charm/schemes/pksig/pksig_cyh.py +132 -0
- charm/schemes/pksig/pksig_dsa.py +76 -0
- charm/schemes/pksig/pksig_ecdsa.py +71 -0
- charm/schemes/pksig/pksig_hess.py +104 -0
- charm/schemes/pksig/pksig_hw.py +110 -0
- charm/schemes/pksig/pksig_lamport.py +63 -0
- charm/schemes/pksig/pksig_ps01.py +135 -0
- charm/schemes/pksig/pksig_ps02.py +124 -0
- charm/schemes/pksig/pksig_ps03.py +119 -0
- charm/schemes/pksig/pksig_rsa_hw09.py +206 -0
- charm/schemes/pksig/pksig_schnorr91.py +77 -0
- charm/schemes/pksig/pksig_waters.py +115 -0
- charm/schemes/pksig/pksig_waters05.py +121 -0
- charm/schemes/pksig/pksig_waters09.py +121 -0
- charm/schemes/pre_mg07.py +150 -0
- charm/schemes/prenc/pre_afgh06.py +126 -0
- charm/schemes/prenc/pre_bbs98.py +123 -0
- charm/schemes/prenc/pre_nal16.py +216 -0
- charm/schemes/protocol_a01.py +272 -0
- charm/schemes/protocol_ao00.py +215 -0
- charm/schemes/protocol_cns07.py +274 -0
- charm/schemes/protocol_schnorr91.py +125 -0
- charm/schemes/sigma1.py +64 -0
- charm/schemes/sigma2.py +129 -0
- charm/schemes/sigma3.py +126 -0
- charm/schemes/threshold/__init__.py +59 -0
- charm/schemes/threshold/dkls23_dkg.py +556 -0
- charm/schemes/threshold/dkls23_presign.py +1089 -0
- charm/schemes/threshold/dkls23_sign.py +761 -0
- charm/schemes/threshold/xrpl_wallet.py +967 -0
- charm/test/__init__.py +0 -0
- charm/test/adapters/__init__.py +0 -0
- charm/test/adapters/abenc_adapt_hybrid_test.py +29 -0
- charm/test/adapters/dabenc_adapt_hybrid_test.py +56 -0
- charm/test/adapters/ibenc_adapt_hybrid_test.py +36 -0
- charm/test/adapters/ibenc_adapt_identityhash_test.py +32 -0
- charm/test/adapters/kpabenc_adapt_hybrid_test.py +30 -0
- charm/test/benchmark/abenc_yllc15_bench.py +92 -0
- charm/test/benchmark/benchmark_test.py +148 -0
- charm/test/benchmark_threshold.py +260 -0
- charm/test/conftest.py +38 -0
- charm/test/fuzz/__init__.py +1 -0
- charm/test/fuzz/conftest.py +5 -0
- charm/test/fuzz/fuzz_policy_parser.py +76 -0
- charm/test/fuzz/fuzz_serialization.py +83 -0
- charm/test/schemes/__init__.py +0 -0
- charm/test/schemes/abenc/__init__.py +0 -0
- charm/test/schemes/abenc/abenc_bsw07_test.py +39 -0
- charm/test/schemes/abenc/abenc_dacmacs_yj14_test.py +16 -0
- charm/test/schemes/abenc/abenc_lsw08_test.py +33 -0
- charm/test/schemes/abenc/abenc_maabe_yj14_test.py +16 -0
- charm/test/schemes/abenc/abenc_tbpre_lww14_test.py +16 -0
- charm/test/schemes/abenc/abenc_waters09_test.py +38 -0
- charm/test/schemes/abenc/abenc_yllc15_test.py +74 -0
- charm/test/schemes/chamhash_adm05_test.py +31 -0
- charm/test/schemes/chamhash_rsa_hw09_test.py +29 -0
- charm/test/schemes/commit/__init__.py +0 -0
- charm/test/schemes/commit/commit_gs08_test.py +24 -0
- charm/test/schemes/commit/commit_pedersen92_test.py +26 -0
- charm/test/schemes/dabe_aw11_test.py +45 -0
- charm/test/schemes/encap_bchk05_test.py +21 -0
- charm/test/schemes/grpsig/__init__.py +0 -0
- charm/test/schemes/grpsig/groupsig_bgls04_test.py +35 -0
- charm/test/schemes/grpsig/groupsig_bgls04_var_test.py +39 -0
- charm/test/schemes/hibenc/__init__.py +0 -0
- charm/test/schemes/hibenc/hibenc_bb04_test.py +28 -0
- charm/test/schemes/ibenc/__init__.py +0 -0
- charm/test/schemes/ibenc/ibenc_bb03_test.py +26 -0
- charm/test/schemes/ibenc/ibenc_bf01_test.py +24 -0
- charm/test/schemes/ibenc/ibenc_ckrs09_test.py +25 -0
- charm/test/schemes/ibenc/ibenc_lsw08_test.py +31 -0
- charm/test/schemes/ibenc/ibenc_sw05_test.py +32 -0
- charm/test/schemes/ibenc/ibenc_waters05_test.py +31 -0
- charm/test/schemes/ibenc/ibenc_waters09_test.py +27 -0
- charm/test/schemes/pk_vrf_test.py +29 -0
- charm/test/schemes/pkenc/__init__.py +0 -0
- charm/test/schemes/pkenc_test.py +255 -0
- charm/test/schemes/pksig/__init__.py +0 -0
- charm/test/schemes/pksig_test.py +376 -0
- charm/test/schemes/rsa_alg_test.py +340 -0
- charm/test/schemes/threshold_test.py +1792 -0
- charm/test/serialize/__init__.py +0 -0
- charm/test/serialize/serialize_test.py +40 -0
- charm/test/toolbox/__init__.py +0 -0
- charm/test/toolbox/conversion_test.py +30 -0
- charm/test/toolbox/ecgroup_test.py +53 -0
- charm/test/toolbox/integer_arithmetic_test.py +441 -0
- charm/test/toolbox/paddingschemes_test.py +238 -0
- charm/test/toolbox/policy_parser_stress_test.py +969 -0
- charm/test/toolbox/secretshare_test.py +28 -0
- charm/test/toolbox/symcrypto_test.py +108 -0
- charm/test/toolbox/test_policy_expression.py +16 -0
- charm/test/vectors/__init__.py +1 -0
- charm/test/vectors/test_bls_vectors.py +289 -0
- charm/test/vectors/test_pedersen_vectors.py +315 -0
- charm/test/vectors/test_schnorr_vectors.py +368 -0
- charm/test/zkp_compiler/__init__.py +9 -0
- charm/test/zkp_compiler/benchmark_zkp.py +258 -0
- charm/test/zkp_compiler/test_and_proof.py +240 -0
- charm/test/zkp_compiler/test_batch_verify.py +248 -0
- charm/test/zkp_compiler/test_dleq_proof.py +264 -0
- charm/test/zkp_compiler/test_or_proof.py +231 -0
- charm/test/zkp_compiler/test_proof_serialization.py +121 -0
- charm/test/zkp_compiler/test_range_proof.py +241 -0
- charm/test/zkp_compiler/test_representation_proof.py +325 -0
- charm/test/zkp_compiler/test_schnorr_proof.py +221 -0
- charm/test/zkp_compiler/test_thread_safety.py +169 -0
- charm/test/zkp_compiler/test_zkp_parser.py +139 -0
- charm/toolbox/ABEnc.py +26 -0
- charm/toolbox/ABEncMultiAuth.py +66 -0
- charm/toolbox/ABEnumeric.py +800 -0
- charm/toolbox/Commit.py +24 -0
- charm/toolbox/DFA.py +89 -0
- charm/toolbox/FSA.py +1254 -0
- charm/toolbox/Hash.py +39 -0
- charm/toolbox/IBEnc.py +62 -0
- charm/toolbox/IBSig.py +64 -0
- charm/toolbox/PKEnc.py +66 -0
- charm/toolbox/PKSig.py +56 -0
- charm/toolbox/PREnc.py +32 -0
- charm/toolbox/ZKProof.py +289 -0
- charm/toolbox/__init__.py +0 -0
- charm/toolbox/bitstring.py +49 -0
- charm/toolbox/broadcast.py +220 -0
- charm/toolbox/conversion.py +100 -0
- charm/toolbox/eccurve.py +149 -0
- charm/toolbox/ecgroup.py +143 -0
- charm/toolbox/enum.py +60 -0
- charm/toolbox/hash_module.py +91 -0
- charm/toolbox/integergroup.py +323 -0
- charm/toolbox/iterate.py +22 -0
- charm/toolbox/matrixops.py +76 -0
- charm/toolbox/mpc_utils.py +296 -0
- charm/toolbox/msp.py +175 -0
- charm/toolbox/mta.py +985 -0
- charm/toolbox/node.py +120 -0
- charm/toolbox/ot/__init__.py +22 -0
- charm/toolbox/ot/base_ot.py +374 -0
- charm/toolbox/ot/dpf.py +642 -0
- charm/toolbox/ot/mpfss.py +228 -0
- charm/toolbox/ot/ot_extension.py +589 -0
- charm/toolbox/ot/silent_ot.py +378 -0
- charm/toolbox/paddingschemes.py +423 -0
- charm/toolbox/paddingschemes_test.py +238 -0
- charm/toolbox/pairingcurves.py +85 -0
- charm/toolbox/pairinggroup.py +186 -0
- charm/toolbox/policy_expression_spec.py +70 -0
- charm/toolbox/policytree.py +189 -0
- charm/toolbox/reCompiler.py +346 -0
- charm/toolbox/redundancyschemes.py +65 -0
- charm/toolbox/schemebase.py +188 -0
- charm/toolbox/secretshare.py +104 -0
- charm/toolbox/secretutil.py +174 -0
- charm/toolbox/securerandom.py +73 -0
- charm/toolbox/sigmaprotocol.py +46 -0
- charm/toolbox/specialprimes.py +45 -0
- charm/toolbox/symcrypto.py +279 -0
- charm/toolbox/threshold_sharing.py +553 -0
- charm/toolbox/xmlserialize.py +94 -0
- charm/toolbox/zknode.py +105 -0
- charm/zkp_compiler/__init__.py +89 -0
- charm/zkp_compiler/and_proof.py +460 -0
- charm/zkp_compiler/batch_verify.py +324 -0
- charm/zkp_compiler/dleq_proof.py +423 -0
- charm/zkp_compiler/or_proof.py +305 -0
- charm/zkp_compiler/range_proof.py +417 -0
- charm/zkp_compiler/representation_proof.py +466 -0
- charm/zkp_compiler/schnorr_proof.py +273 -0
- charm/zkp_compiler/thread_safe.py +150 -0
- charm/zkp_compiler/zk_demo.py +489 -0
- charm/zkp_compiler/zkp_factory.py +330 -0
- charm/zkp_compiler/zkp_generator.py +370 -0
- charm/zkp_compiler/zkparser.py +269 -0
- charm_crypto_framework-0.61.1.dist-info/METADATA +337 -0
- charm_crypto_framework-0.61.1.dist-info/RECORD +323 -0
- charm_crypto_framework-0.61.1.dist-info/WHEEL +5 -0
- charm_crypto_framework-0.61.1.dist-info/licenses/LICENSE.txt +165 -0
- charm_crypto_framework-0.61.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#ifndef BENCHMARK_UTIL_H
|
|
2
|
+
#define BENCHMARK_UTIL_H
|
|
3
|
+
|
|
4
|
+
// for multiplicative notation
|
|
5
|
+
#define Op_MUL(op_var_type, op_group_type, group, bench_obj) \
|
|
6
|
+
if(op_var_type == MULTIPLICATION && op_group_type == group) \
|
|
7
|
+
((Operations *) bench_obj)->mul_ ##group += 1;
|
|
8
|
+
|
|
9
|
+
#define Op_DIV(op_var_type, op_group_type, group, bench_obj) \
|
|
10
|
+
if(op_var_type == DIVISION && op_group_type == group) \
|
|
11
|
+
((Operations *) bench_obj)->div_ ##group += 1;
|
|
12
|
+
|
|
13
|
+
// for additive notation
|
|
14
|
+
#define Op_ADD(op_var_type, op_group_type, group, bench_obj) \
|
|
15
|
+
if(op_var_type == ADDITION && op_group_type == group) \
|
|
16
|
+
((Operations *) bench_obj)->add_ ##group += 1;
|
|
17
|
+
|
|
18
|
+
#define Op_SUB(op_var_type, op_group_type, group, bench_obj) \
|
|
19
|
+
if(op_var_type == SUBTRACTION && op_group_type == group) \
|
|
20
|
+
((Operations *) bench_obj)->sub_ ##group += 1;
|
|
21
|
+
|
|
22
|
+
// exponentiation
|
|
23
|
+
#define Op_EXP(op_var_type, op_group_type, group, bench_obj) \
|
|
24
|
+
if(op_var_type == EXPONENTIATION && op_group_type == group) \
|
|
25
|
+
((Operations *) bench_obj)->exp_ ##group += 1;
|
|
26
|
+
|
|
27
|
+
#define UPDATE_BENCH(op_type, elem_type, gobj) \
|
|
28
|
+
if(gobj->dBench != NULL && gobj->dBench->granular_option == TRUE && elem_type != NONE_G) { \
|
|
29
|
+
Update_Op(MUL, op_type, elem_type, gobj->gBench) \
|
|
30
|
+
Update_Op(DIV, op_type, elem_type, gobj->gBench) \
|
|
31
|
+
Update_Op(ADD, op_type, elem_type, gobj->gBench) \
|
|
32
|
+
Update_Op(SUB, op_type, elem_type, gobj->gBench) \
|
|
33
|
+
Update_Op(EXP, op_type, elem_type, gobj->gBench) \
|
|
34
|
+
} \
|
|
35
|
+
UPDATE_BENCHMARK(op_type, gobj->dBench);
|
|
36
|
+
|
|
37
|
+
#define CLEAR_DBENCH(bench_obj, group) \
|
|
38
|
+
((Operations *) bench_obj)->mul_ ##group = 0; \
|
|
39
|
+
((Operations *) bench_obj)->exp_ ##group = 0; \
|
|
40
|
+
((Operations *) bench_obj)->div_ ##group = 0; \
|
|
41
|
+
((Operations *) bench_obj)->add_ ##group = 0; \
|
|
42
|
+
((Operations *) bench_obj)->sub_ ##group = 0; \
|
|
43
|
+
|
|
44
|
+
#define GetField(count, type, group, bench_obj) \
|
|
45
|
+
if(type == MULTIPLICATION) count = (((Operations *) bench_obj)->mul_ ##group ); \
|
|
46
|
+
else if(type == DIVISION) count = (((Operations *) bench_obj)->div_ ##group ); \
|
|
47
|
+
else if(type == ADDITION) count = (((Operations *) bench_obj)->add_ ##group ); \
|
|
48
|
+
else if(type == SUBTRACTION) count = (((Operations *) bench_obj)->sub_ ##group ); \
|
|
49
|
+
else if(type == EXPONENTIATION) count = (((Operations *) bench_obj)->exp_ ##group );
|
|
50
|
+
|
|
51
|
+
#define ClearBenchmark(data) \
|
|
52
|
+
data->op_add = data->op_sub = data->op_mult = 0; \
|
|
53
|
+
data->op_div = data->op_exp = data->op_pair = 0; \
|
|
54
|
+
data->cpu_time_ms = 0.0; \
|
|
55
|
+
data->real_time_ms = 0.0; \
|
|
56
|
+
data->cpu_option = FALSE; \
|
|
57
|
+
data->real_option = FALSE; \
|
|
58
|
+
data->granular_option = FALSE;
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
#endif
|
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
#define BENCHMARK_MODULE
|
|
2
|
+
#include "benchmarkmodule.h"
|
|
3
|
+
#ifndef BENCHMARK_MODULE
|
|
4
|
+
// define new benchmark type for benchmark module
|
|
5
|
+
PyTypeObject BenchmarkType;
|
|
6
|
+
// define new benchmark error type (will be used for notifying errors)
|
|
7
|
+
PyObject *BenchmarkError;
|
|
8
|
+
#endif
|
|
9
|
+
double CalcUsecs(struct timeval *start, struct timeval *stop) {
|
|
10
|
+
double usec_per_second = 1000000;
|
|
11
|
+
double result = usec_per_second * (stop->tv_sec - start->tv_sec);
|
|
12
|
+
|
|
13
|
+
if(stop->tv_usec >= start->tv_usec) {
|
|
14
|
+
result += (stop->tv_usec - start->tv_usec);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
result -= (start->tv_usec - stop->tv_usec);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// if(result < 0) {
|
|
21
|
+
// debug("start secs => '%ld' and usecs => '%d'\n", start->tv_sec, start->tv_usec);
|
|
22
|
+
// debug("stop secs => '%ld' and usecs => '%d'\n", stop->tv_sec, stop->tv_usec);
|
|
23
|
+
// }
|
|
24
|
+
|
|
25
|
+
return result / usec_per_second;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
int check_option(MeasureType o, Benchmark *d) {
|
|
29
|
+
int i;
|
|
30
|
+
if(d != NULL && d->bench_initialized) {
|
|
31
|
+
for(i = 0; i < d->num_options; i++) {
|
|
32
|
+
MeasureType tmp = d->options_selected[i];
|
|
33
|
+
if(tmp == o) { return TRUE; }
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return FALSE;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
// benchmark new
|
|
41
|
+
PyObject *Benchmark_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
|
42
|
+
{
|
|
43
|
+
Benchmark *self;
|
|
44
|
+
self = (Benchmark *)type->tp_alloc(type, 0);
|
|
45
|
+
if(self != NULL) {
|
|
46
|
+
self->bench_initialized = FALSE;
|
|
47
|
+
self->bench_inprogress = FALSE; // false until we StartBenchmark( ... )
|
|
48
|
+
self->op_add = self->op_sub = self->op_mult = 0;
|
|
49
|
+
self->op_div = self->op_exp = self->op_pair = 0;
|
|
50
|
+
self->cpu_time_ms = self->real_time_ms = 0.0;
|
|
51
|
+
self->cpu_option = self->real_option = FALSE;
|
|
52
|
+
debug("Creating new benchmark object.\n");
|
|
53
|
+
}
|
|
54
|
+
return (PyObject *) self;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// benchmark init
|
|
58
|
+
int Benchmark_init(Benchmark *self, PyObject *args, PyObject *kwds)
|
|
59
|
+
{
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
// benchmark dealloc
|
|
63
|
+
void Benchmark_dealloc(Benchmark *self) {
|
|
64
|
+
debug("Releasing benchmark object.\n");
|
|
65
|
+
Py_TYPE(self)->tp_free((PyObject*)self);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static int PyStartBenchmark(Benchmark *data, PyObject *opList, int opListSize)
|
|
69
|
+
{
|
|
70
|
+
int i;
|
|
71
|
+
if(!PyList_Check(opList)) {
|
|
72
|
+
PyErr_SetString(BenchmarkError, "did not provide a list.");
|
|
73
|
+
return FALSE;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
PyObject *tmpObj;
|
|
77
|
+
char *s;
|
|
78
|
+
if(data != NULL) {
|
|
79
|
+
int cnt = 0;
|
|
80
|
+
/* initialize */
|
|
81
|
+
data->cpu_option = data->real_option = data->granular_option = FALSE;
|
|
82
|
+
for(i = 0; i < opListSize; i++) {
|
|
83
|
+
PyObject *item = PyList_GetItem(opList, i);
|
|
84
|
+
if(PyBytes_CharmCheck(item)) {
|
|
85
|
+
s = NULL;
|
|
86
|
+
tmpObj = NULL;
|
|
87
|
+
PyBytes_ToString2(s, item, tmpObj);
|
|
88
|
+
if(strcmp(s, _CPUTIME_OPT) == 0) {
|
|
89
|
+
debug("enabled cputime option!\n");
|
|
90
|
+
data->options_selected[cnt] = CPU_TIME;
|
|
91
|
+
data->cpu_option = TRUE;
|
|
92
|
+
}
|
|
93
|
+
else if(strcmp(s, _REALTIME_OPT) == 0) {
|
|
94
|
+
debug("enabled realtime option!\n");
|
|
95
|
+
data->options_selected[cnt] = REAL_TIME;
|
|
96
|
+
data->real_option = TRUE;
|
|
97
|
+
}
|
|
98
|
+
else if(strcmp(s, _ADD_OPT) == 0) {
|
|
99
|
+
debug("enabled add option!\n");
|
|
100
|
+
data->options_selected[cnt] = ADDITION;
|
|
101
|
+
data->op_add = 0;
|
|
102
|
+
}
|
|
103
|
+
else if(strcmp(s, _SUB_OPT) == 0) {
|
|
104
|
+
debug("enabled sub option!\n");
|
|
105
|
+
data->options_selected[cnt] = SUBTRACTION;
|
|
106
|
+
data->op_sub = 0;
|
|
107
|
+
}
|
|
108
|
+
else if(strcmp(s, _MUL_OPT) == 0) {
|
|
109
|
+
debug("enabled mul option!\n");
|
|
110
|
+
data->options_selected[cnt] = MULTIPLICATION;
|
|
111
|
+
data->op_mult = 0;
|
|
112
|
+
}
|
|
113
|
+
else if(strcmp(s, _DIV_OPT) == 0) {
|
|
114
|
+
debug("enabled div option!\n");
|
|
115
|
+
data->options_selected[cnt] = DIVISION;
|
|
116
|
+
data->op_div = 0;
|
|
117
|
+
}
|
|
118
|
+
else if(strcmp(s, _EXP_OPT) == 0) {
|
|
119
|
+
debug("enabled exp option!\n");
|
|
120
|
+
data->options_selected[cnt] = EXPONENTIATION;
|
|
121
|
+
data->op_exp = 0;
|
|
122
|
+
}
|
|
123
|
+
else if(strcmp(s, _PAIR_OPT) == 0) {
|
|
124
|
+
debug("enabled pair option!\n");
|
|
125
|
+
data->options_selected[cnt] = PAIRINGS;
|
|
126
|
+
data->op_pair = 0;
|
|
127
|
+
}
|
|
128
|
+
else if(strcmp(s, _GRAN_OPT) == 0) {
|
|
129
|
+
debug("enabled granular option!\n");
|
|
130
|
+
data->options_selected[cnt] = GRANULAR;
|
|
131
|
+
data->granular_option = TRUE;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
debug("not a valid option.\n");
|
|
135
|
+
}
|
|
136
|
+
cnt++;
|
|
137
|
+
if (tmpObj!=NULL)
|
|
138
|
+
Py_DECREF(tmpObj);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// set size of list
|
|
142
|
+
data->num_options = cnt;
|
|
143
|
+
debug("num_options set: %d\n", data->num_options);
|
|
144
|
+
data->bench_initialized = TRUE;
|
|
145
|
+
data->bench_inprogress = TRUE;
|
|
146
|
+
|
|
147
|
+
//set timers for time-based measures (reduces the overhead of timer)
|
|
148
|
+
if(data->cpu_option) { data->start_clock = clock(); }
|
|
149
|
+
if(data->real_option) { gettimeofday(&data->start_time, NULL); }
|
|
150
|
+
return TRUE;
|
|
151
|
+
}
|
|
152
|
+
return FALSE;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
static int PyEndBenchmark(Benchmark *data)
|
|
156
|
+
{
|
|
157
|
+
gettimeofday(&data->stop_time, NULL); // stop real time clock
|
|
158
|
+
data->stop_clock = clock(); // stop cpu time clock
|
|
159
|
+
int i;
|
|
160
|
+
if(data != NULL && data->bench_initialized) {
|
|
161
|
+
debug("Results....\n");
|
|
162
|
+
for(i = 0; i < data->num_options; i++) {
|
|
163
|
+
MeasureType option = data->options_selected[i];
|
|
164
|
+
debug("option => %d\n", option);
|
|
165
|
+
switch(option) {
|
|
166
|
+
case CPU_TIME: // compute processor time or clocks per sec
|
|
167
|
+
data->cpu_time_ms = ((double)(data->stop_clock - data->start_clock))/CLOCKS_PER_SEC;
|
|
168
|
+
debug("CPU Time:\t%f\n", data->cpu_time_ms);
|
|
169
|
+
break;
|
|
170
|
+
case REAL_TIME: debug("realtime option was set!\n");
|
|
171
|
+
data->real_time_ms = CalcUsecs(&data->start_time, &data->stop_time);
|
|
172
|
+
debug("Real Time:\t%f\n", data->real_time_ms);
|
|
173
|
+
break;
|
|
174
|
+
case ADDITION: debug("add operations:\t\t%d\n", data->op_add); break;
|
|
175
|
+
case SUBTRACTION: debug("sub operations:\t\t%d\n", data->op_sub); break;
|
|
176
|
+
case MULTIPLICATION: debug("mult operations:\t\t%d\n", data->op_mult); break;
|
|
177
|
+
case DIVISION: debug("div operations:\t\t%d\n", data->op_div); break;
|
|
178
|
+
case EXPONENTIATION: debug("exp operations:\t\t%d\n", data->op_exp); break;
|
|
179
|
+
case PAIRINGS: debug("pairing operations:\t\t%d\n", data->op_pair); break;
|
|
180
|
+
case GRANULAR: debug("granular option was set!\n"); break;
|
|
181
|
+
default: debug("not a valid option.\n"); break;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
data->bench_inprogress = FALSE;
|
|
185
|
+
return TRUE;
|
|
186
|
+
}
|
|
187
|
+
return FALSE;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
static int PyUpdateBenchmark(MeasureType option, Benchmark *data) {
|
|
191
|
+
int i, errcode = FALSE, foundOption = FALSE;
|
|
192
|
+
// make sure option is set in benchmark
|
|
193
|
+
|
|
194
|
+
if(data != NULL && data->bench_initialized) {
|
|
195
|
+
for(i = 0; i < data->num_options; i++) {
|
|
196
|
+
MeasureType tmp = data->options_selected[i];
|
|
197
|
+
if(tmp == option) { foundOption = TRUE; break; }
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// if so, just increment the corresponding operation option counter
|
|
202
|
+
if(foundOption) {
|
|
203
|
+
switch(option) {
|
|
204
|
+
case ADDITION: data->op_add++; break;
|
|
205
|
+
case SUBTRACTION: data->op_sub++; break;
|
|
206
|
+
case MULTIPLICATION: data->op_mult++; break;
|
|
207
|
+
case DIVISION: data->op_div++; break;
|
|
208
|
+
case EXPONENTIATION: data->op_exp++; break;
|
|
209
|
+
case PAIRINGS: data->op_pair++; break;
|
|
210
|
+
default: debug("not a valid option.\n");
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
errcode = TRUE;
|
|
214
|
+
}
|
|
215
|
+
return errcode;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
static int PyClearBenchmark(Benchmark *data) {
|
|
219
|
+
if(data == NULL) { return FALSE; }
|
|
220
|
+
|
|
221
|
+
data->bench_initialized = FALSE;
|
|
222
|
+
data->identifier = -1;
|
|
223
|
+
data->op_add = data->op_sub = data->op_mult = 0;
|
|
224
|
+
data->op_div = data->op_exp = data->op_pair = 0;
|
|
225
|
+
data->cpu_time_ms = 0.0;
|
|
226
|
+
data->real_time_ms = 0.0;
|
|
227
|
+
data->cpu_option = FALSE;
|
|
228
|
+
data->real_option = FALSE;
|
|
229
|
+
data->granular_option = FALSE;
|
|
230
|
+
memset(data->options_selected, 0, MAX_MEASURE);
|
|
231
|
+
debug("Initialized benchmark object.\n");
|
|
232
|
+
return TRUE;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
PyObject *Benchmark_print(Benchmark *self) {
|
|
236
|
+
if(self != NULL) {
|
|
237
|
+
PyObject *cpu = PyFloat_FromDouble(self->cpu_time_ms);
|
|
238
|
+
PyObject *real = PyFloat_FromDouble(self->real_time_ms);
|
|
239
|
+
PyObject *results = _PyUnicode_FromFormat("<--- Results --->\nCPU Time: %Sms\nReal Time: %Ss\nAdd:\t%i\nSub:\t%i\nMul:\t%i\nDiv:\t%i\nExp:\t%i\nPair:\t%i\n",
|
|
240
|
+
cpu, real, self->op_add, self->op_sub, self->op_mult, self->op_div, self->op_exp, self->op_pair);
|
|
241
|
+
|
|
242
|
+
PyClearBenchmark(self);
|
|
243
|
+
return results;
|
|
244
|
+
}
|
|
245
|
+
return _PyUnicode_FromString("Benchmark object has not been initialized properly.");
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
PyObject *GetResults(Benchmark *self) {
|
|
249
|
+
if(self != NULL) {
|
|
250
|
+
return Py_BuildValue("{sfsfsisisisisi}",
|
|
251
|
+
"CpuTime", self->cpu_time_ms, "RealTime", self->real_time_ms,
|
|
252
|
+
"Add", self->op_add, "Sub", self->op_sub, "Mul", self->op_mult,
|
|
253
|
+
"Div", self->op_div, "Exp", self->op_exp);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return _PyUnicode_FromString("Benchmark object has not been initialized properly.");
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
PyObject *GetResultsWithPair(Benchmark *self) {
|
|
260
|
+
if(self != NULL) {
|
|
261
|
+
return Py_BuildValue("{sfsfsisisisisisi}",
|
|
262
|
+
"CpuTime", self->cpu_time_ms, "RealTime", self->real_time_ms,
|
|
263
|
+
"Add", self->op_add, "Sub", self->op_sub, "Mul", self->op_mult,
|
|
264
|
+
"Div", self->op_div, "Exp", self->op_exp, "Pair", self->op_pair);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return _PyUnicode_FromString("Benchmark object has not been initialized properly.");
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
PyObject *Retrieve_result(Benchmark *self, char *option) {
|
|
272
|
+
PyObject *result = NULL;
|
|
273
|
+
|
|
274
|
+
if(self != NULL) {
|
|
275
|
+
if(strcmp(option, _CPUTIME_OPT) == 0) {
|
|
276
|
+
result = PyFloat_FromDouble(self->cpu_time_ms);
|
|
277
|
+
}
|
|
278
|
+
else if(strcmp(option, _REALTIME_OPT) == 0) {
|
|
279
|
+
result = PyFloat_FromDouble(self->real_time_ms);
|
|
280
|
+
}
|
|
281
|
+
else if(strcmp(option, _ADD_OPT) == 0) {
|
|
282
|
+
result = PyToLongObj(self->op_add);
|
|
283
|
+
}
|
|
284
|
+
else if(strcmp(option, _SUB_OPT) == 0) {
|
|
285
|
+
result = PyToLongObj(self->op_sub);
|
|
286
|
+
}
|
|
287
|
+
else if(strcmp(option, _MUL_OPT) == 0) {
|
|
288
|
+
result = PyToLongObj(self->op_mult);
|
|
289
|
+
}
|
|
290
|
+
else if(strcmp(option, _DIV_OPT) == 0) {
|
|
291
|
+
result = PyToLongObj(self->op_div);
|
|
292
|
+
}
|
|
293
|
+
else if(strcmp(option, _EXP_OPT) == 0) {
|
|
294
|
+
result = PyToLongObj(self->op_exp);
|
|
295
|
+
}
|
|
296
|
+
else if(strcmp(option, _PAIR_OPT) == 0) {
|
|
297
|
+
result = PyToLongObj(self->op_pair);
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
debug("not a valid option.\n");
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return result;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
#if PY_MAJOR_VERSION >= 3
|
|
307
|
+
PyTypeObject BenchmarkType = {
|
|
308
|
+
PyVarObject_HEAD_INIT(NULL, 0)
|
|
309
|
+
"profile.Benchmark", /*tp_name*/
|
|
310
|
+
sizeof(Benchmark), /*tp_basicsize*/
|
|
311
|
+
0, /*tp_itemsize*/
|
|
312
|
+
(destructor)Benchmark_dealloc, /*tp_dealloc*/
|
|
313
|
+
0, /*tp_print*/
|
|
314
|
+
0, /*tp_getattr*/
|
|
315
|
+
0, /*tp_setattr*/
|
|
316
|
+
0, /*tp_reserved*/
|
|
317
|
+
0, /*tp_repr*/
|
|
318
|
+
0, /*tp_as_number*/
|
|
319
|
+
0, /*tp_as_sequence*/
|
|
320
|
+
0, /*tp_as_mapping*/
|
|
321
|
+
0, /*tp_hash */
|
|
322
|
+
0, /*tp_call*/
|
|
323
|
+
0, /*tp_str*/
|
|
324
|
+
0, /*tp_getattro*/
|
|
325
|
+
0, /*tp_setattro*/
|
|
326
|
+
0, /*tp_as_buffer*/
|
|
327
|
+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
|
328
|
+
"Benchmark objects", /* tp_doc */
|
|
329
|
+
0, /* tp_traverse */
|
|
330
|
+
0, /* tp_clear */
|
|
331
|
+
0, /* tp_richcompare */
|
|
332
|
+
0, /* tp_weaklistoffset */
|
|
333
|
+
0, /* tp_iter */
|
|
334
|
+
0, /* tp_iternext */
|
|
335
|
+
0, /* tp_methods */
|
|
336
|
+
0, /* tp_members */
|
|
337
|
+
0, /* tp_getset */
|
|
338
|
+
0, /* tp_base */
|
|
339
|
+
0, /* tp_dict */
|
|
340
|
+
0, /* tp_descr_get */
|
|
341
|
+
0, /* tp_descr_set */
|
|
342
|
+
0, /* tp_dictoffset */
|
|
343
|
+
(initproc)Benchmark_init, /* tp_init */
|
|
344
|
+
0, /* tp_alloc */
|
|
345
|
+
Benchmark_new, /* tp_new */
|
|
346
|
+
};
|
|
347
|
+
|
|
348
|
+
#else
|
|
349
|
+
PyTypeObject BenchmarkType = {
|
|
350
|
+
PyVarObject_HEAD_INIT(NULL, 0)
|
|
351
|
+
"profile.Benchmark", /*tp_name*/
|
|
352
|
+
sizeof(Benchmark), /*tp_basicsize*/
|
|
353
|
+
0, /*tp_itemsize*/
|
|
354
|
+
(destructor)Benchmark_dealloc, /*tp_dealloc*/
|
|
355
|
+
0, /*tp_print*/
|
|
356
|
+
0, /*tp_getattr*/
|
|
357
|
+
0, /*tp_setattr*/
|
|
358
|
+
0, /*tp_reserved*/
|
|
359
|
+
0, /*tp_repr*/
|
|
360
|
+
0, /*tp_as_number*/
|
|
361
|
+
0, /*tp_as_sequence*/
|
|
362
|
+
0, /*tp_as_mapping*/
|
|
363
|
+
0, /*tp_hash */
|
|
364
|
+
0, /*tp_call*/
|
|
365
|
+
0, /*tp_str*/
|
|
366
|
+
0, /*tp_getattro*/
|
|
367
|
+
0, /*tp_setattro*/
|
|
368
|
+
0, /*tp_as_buffer*/
|
|
369
|
+
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
|
370
|
+
"Benchmark objects", /* tp_doc */
|
|
371
|
+
0, /* tp_traverse */
|
|
372
|
+
0, /* tp_clear */
|
|
373
|
+
0, /* tp_richcompare */
|
|
374
|
+
0, /* tp_weaklistoffset */
|
|
375
|
+
0, /* tp_iter */
|
|
376
|
+
0, /* tp_iternext */
|
|
377
|
+
0, /* tp_methods */
|
|
378
|
+
0, /* tp_members */
|
|
379
|
+
0, /* tp_getset */
|
|
380
|
+
0, /* tp_base */
|
|
381
|
+
0, /* tp_dict */
|
|
382
|
+
0, /* tp_descr_get */
|
|
383
|
+
0, /* tp_descr_set */
|
|
384
|
+
0, /* tp_dictoffset */
|
|
385
|
+
(initproc)Benchmark_init, /* tp_init */
|
|
386
|
+
0, /* tp_alloc */
|
|
387
|
+
Benchmark_new, /* tp_new */
|
|
388
|
+
};
|
|
389
|
+
#endif
|
|
390
|
+
|
|
391
|
+
struct module_state {
|
|
392
|
+
PyObject *error;
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
#if PY_MAJOR_VERSION >= 3
|
|
396
|
+
#define GETSTATE(m) ((struct module_state *) PyModule_GetState(m))
|
|
397
|
+
#else
|
|
398
|
+
#define GETSTATE(m) (&_state)
|
|
399
|
+
static struct module_state _state;
|
|
400
|
+
#endif
|
|
401
|
+
|
|
402
|
+
// benchmark type methods (module scope)
|
|
403
|
+
static PyMethodDef module_methods[] = {
|
|
404
|
+
{NULL}
|
|
405
|
+
};
|
|
406
|
+
|
|
407
|
+
#if PY_MAJOR_VERSION >= 3
|
|
408
|
+
static int bm_traverse(PyObject *m, visitproc visit, void *arg) {
|
|
409
|
+
Py_VISIT(GETSTATE(m)->error);
|
|
410
|
+
return 0;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
static int bm_clear(PyObject *m) {
|
|
414
|
+
Py_CLEAR(GETSTATE(m)->error);
|
|
415
|
+
return 0;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
static struct PyModuleDef moduledef = {
|
|
419
|
+
PyModuleDef_HEAD_INIT,
|
|
420
|
+
"benchmark",
|
|
421
|
+
NULL,
|
|
422
|
+
sizeof(struct module_state),
|
|
423
|
+
module_methods,
|
|
424
|
+
NULL,
|
|
425
|
+
bm_traverse,
|
|
426
|
+
bm_clear,
|
|
427
|
+
NULL
|
|
428
|
+
};
|
|
429
|
+
|
|
430
|
+
#define INITERROR return NULL
|
|
431
|
+
PyMODINIT_FUNC
|
|
432
|
+
PyInit_benchmark(void) {
|
|
433
|
+
#else
|
|
434
|
+
#define INITERROR return
|
|
435
|
+
void initbenchmark(void) {
|
|
436
|
+
#endif
|
|
437
|
+
PyObject *module;
|
|
438
|
+
static void *PyBenchmark_API[PyBenchmark_API_pointers];
|
|
439
|
+
PyObject *api_object;
|
|
440
|
+
|
|
441
|
+
if(PyType_Ready(&BenchmarkType) < 0) INITERROR;
|
|
442
|
+
|
|
443
|
+
#if PY_MAJOR_VERSION >= 3
|
|
444
|
+
module = PyModule_Create(&moduledef);
|
|
445
|
+
#else
|
|
446
|
+
module = Py_InitModule("benchmark", module_methods);
|
|
447
|
+
#endif
|
|
448
|
+
if(module == NULL) INITERROR;
|
|
449
|
+
|
|
450
|
+
struct module_state *st = GETSTATE(module);
|
|
451
|
+
st->error = PyErr_NewException("benchmark.Error", NULL, NULL);
|
|
452
|
+
if(st->error == NULL) {
|
|
453
|
+
Py_DECREF(module);
|
|
454
|
+
INITERROR;
|
|
455
|
+
}
|
|
456
|
+
BenchmarkError = st->error;
|
|
457
|
+
|
|
458
|
+
/* initialize the c api pointer array - this is what other modules call */
|
|
459
|
+
PyBenchmark_API[PyBenchmark_Start] = (void *)PyStartBenchmark;
|
|
460
|
+
PyBenchmark_API[PyBenchmark_End] = (void *)PyEndBenchmark;
|
|
461
|
+
PyBenchmark_API[PyBenchmark_Update] = (void *)PyUpdateBenchmark;
|
|
462
|
+
PyBenchmark_API[PyBenchmark_Clear] = (void *)PyClearBenchmark;
|
|
463
|
+
|
|
464
|
+
api_object = (PyObject *) PyCapsule_New((void *) PyBenchmark_API,BENCHMARK_MOD_NAME, NULL);
|
|
465
|
+
if(api_object != NULL) {
|
|
466
|
+
PyModule_AddObject(module, "_C_API", api_object);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
Py_INCREF(&BenchmarkType);
|
|
470
|
+
PyModule_AddObject(module, "Benchmark", (PyObject *) &BenchmarkType);
|
|
471
|
+
// add exception handler
|
|
472
|
+
#if PY_MAJOR_VERSION >= 3
|
|
473
|
+
return module;
|
|
474
|
+
#endif
|
|
475
|
+
|
|
476
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* benchmarkmodule.h
|
|
3
|
+
*/
|
|
4
|
+
#ifndef Py_BENCHMARKMODULE_H_
|
|
5
|
+
#define Py_BENCHMARKMODULE_H_
|
|
6
|
+
#ifdef __cplusplus
|
|
7
|
+
extern "C" {
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
#ifndef PY_SSIZE_T_CLEAN
|
|
11
|
+
#define PY_SSIZE_T_CLEAN
|
|
12
|
+
#endif
|
|
13
|
+
|
|
14
|
+
#include <Python.h>
|
|
15
|
+
#include <structmember.h>
|
|
16
|
+
#include <sys/time.h>
|
|
17
|
+
|
|
18
|
+
// set default if not passed in by compiler
|
|
19
|
+
//#ifndef BENCHMARK_ENABLED
|
|
20
|
+
//#define BENCHMARK_ENABLED 1vi bad
|
|
21
|
+
//#endif
|
|
22
|
+
//#define DEBUG 1
|
|
23
|
+
#define TRUE 1
|
|
24
|
+
#define FALSE 0
|
|
25
|
+
|
|
26
|
+
#ifdef DEBUG
|
|
27
|
+
#define debug(...) printf("DEBUG: "__VA_ARGS__)
|
|
28
|
+
#else
|
|
29
|
+
#define debug(...)
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
/* Python 3.x definitions */
|
|
33
|
+
#define _PyLong_Check(o1) PyLong_Check(o1)
|
|
34
|
+
#define ConvertToInt(o) PyLong_AsLong(o)
|
|
35
|
+
#define PyToLongObj(o) PyLong_FromLong(o)
|
|
36
|
+
/* check for both unicode and bytes objects */
|
|
37
|
+
#define PyBytes_CharmCheck(obj) PyUnicode_Check(obj) || PyBytes_Check(obj)
|
|
38
|
+
/* if unicode then add extra conversion step. two possibilities: unicode or bytes */
|
|
39
|
+
#define PyBytes_ToString2(a, obj, tmp_obj) \
|
|
40
|
+
if(PyBytes_Check(obj)) { a = PyBytes_AsString(obj); } \
|
|
41
|
+
else if(PyUnicode_Check(obj)) { tmp_obj = PyUnicode_AsUTF8String(obj); a = PyBytes_AsString(tmp_obj); } \
|
|
42
|
+
else { tmp_obj = PyObject_Str(obj); a = PyBytes_AsString(tmp_obj); }
|
|
43
|
+
|
|
44
|
+
#define _PyUnicode_FromFormat PyUnicode_FromFormat
|
|
45
|
+
#define _PyUnicode_FromString PyUnicode_FromString
|
|
46
|
+
|
|
47
|
+
#define BENCHMARK_MOD_NAME "charm.core.benchmark._C_API"
|
|
48
|
+
|
|
49
|
+
#ifndef BENCHMARK_MODULE
|
|
50
|
+
// define new benchmark type for benchmark module
|
|
51
|
+
extern PyTypeObject BenchmarkType;
|
|
52
|
+
// define new benchmark error type (will be used for notifying errors)
|
|
53
|
+
extern PyObject *BenchmarkError;
|
|
54
|
+
#else
|
|
55
|
+
// define new benchmark type for benchmark module
|
|
56
|
+
PyTypeObject BenchmarkType;
|
|
57
|
+
// define new benchmark error type (will be used for notifying errors)
|
|
58
|
+
PyObject *BenchmarkError;
|
|
59
|
+
#endif
|
|
60
|
+
// define a macro to help determine whether an object is of benchmark type
|
|
61
|
+
#define PyBenchmark_Check(obj) PyObject_TypeCheck(obj, &BenchmarkType)
|
|
62
|
+
/* header file for benchmark module */
|
|
63
|
+
#define MAX_MEASURE 10
|
|
64
|
+
enum Measure {CPU_TIME = 0, REAL_TIME, NATIVE_TIME, ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION, EXPONENTIATION, PAIRINGS, GRANULAR, NONE};
|
|
65
|
+
typedef enum Measure MeasureType;
|
|
66
|
+
#define _CPUTIME_OPT "CpuTime"
|
|
67
|
+
#define _REALTIME_OPT "RealTime"
|
|
68
|
+
#define _ADD_OPT "Add"
|
|
69
|
+
#define _SUB_OPT "Sub"
|
|
70
|
+
#define _MUL_OPT "Mul"
|
|
71
|
+
#define _DIV_OPT "Div"
|
|
72
|
+
#define _EXP_OPT "Exp"
|
|
73
|
+
#define _PAIR_OPT "Pair"
|
|
74
|
+
#define _GRAN_OPT "Granular"
|
|
75
|
+
|
|
76
|
+
typedef struct {
|
|
77
|
+
PyObject_HEAD
|
|
78
|
+
struct timeval start_time, stop_time, native_time; // track real time
|
|
79
|
+
clock_t start_clock, stop_clock; // track cpu time
|
|
80
|
+
|
|
81
|
+
int op_add, op_sub, op_mult, op_div;
|
|
82
|
+
int op_exp, op_pair;
|
|
83
|
+
double cpu_time_ms, real_time_ms;
|
|
84
|
+
int num_options; // track num options for a particular benchmark
|
|
85
|
+
MeasureType options_selected[MAX_MEASURE+1]; // measurement options selected
|
|
86
|
+
int cpu_option, real_option, granular_option;
|
|
87
|
+
int identifier;
|
|
88
|
+
int bench_initialized, bench_inprogress;
|
|
89
|
+
} Benchmark;
|
|
90
|
+
|
|
91
|
+
// PyMethodDef Benchmark_methods[];
|
|
92
|
+
PyObject *Benchmark_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
|
|
93
|
+
void Benchmark_dealloc(Benchmark *self);
|
|
94
|
+
int Benchmark_init(Benchmark *self, PyObject *args, PyObject *kwds);
|
|
95
|
+
|
|
96
|
+
PyObject *Benchmark_print(Benchmark *self);
|
|
97
|
+
PyObject *GetResults(Benchmark *self);
|
|
98
|
+
PyObject *GetResultsWithPair(Benchmark *self);
|
|
99
|
+
PyObject *Retrieve_result(Benchmark *self, char *option);
|
|
100
|
+
|
|
101
|
+
/* c api functions */
|
|
102
|
+
#define PyBenchmark_Start 0
|
|
103
|
+
#define PyBenchmark_End 1
|
|
104
|
+
#define PyBenchmark_Update 2
|
|
105
|
+
#define PyBenchmark_Clear 3
|
|
106
|
+
|
|
107
|
+
/* total number of C api pointers? */
|
|
108
|
+
#define PyBenchmark_API_pointers 4
|
|
109
|
+
|
|
110
|
+
#ifdef BENCHMARK_ENABLED
|
|
111
|
+
#define UPDATE_BENCHMARK(option, bench) \
|
|
112
|
+
if(bench != NULL && bench->bench_initialized == TRUE) { \
|
|
113
|
+
PyUpdateBenchmark(option, bench); }
|
|
114
|
+
|
|
115
|
+
#else
|
|
116
|
+
#define UPDATE_BENCHMARK(option, bench) /* ... */
|
|
117
|
+
#endif
|
|
118
|
+
|
|
119
|
+
#ifdef BENCHMARK_MODULE
|
|
120
|
+
/* This section is used when compiling benchmarkmodule.c */
|
|
121
|
+
static int PyStartBenchmark(Benchmark *data, PyObject *opList, int opListSize);
|
|
122
|
+
static int PyEndBenchmark(Benchmark *data);
|
|
123
|
+
static int PyUpdateBenchmark(MeasureType option, Benchmark *data);
|
|
124
|
+
static int PyClearBenchmark(Benchmark *data);
|
|
125
|
+
|
|
126
|
+
#else
|
|
127
|
+
|
|
128
|
+
/* This section is used in modules that use benchmarkmodule's API
|
|
129
|
+
* e.g. pairingmath, integermath, etc.
|
|
130
|
+
*/
|
|
131
|
+
static void **PyBenchmark_API;
|
|
132
|
+
|
|
133
|
+
#define PyStartBenchmark (*(int (*)(Benchmark *data, PyObject *opList, int opListSize)) PyBenchmark_API[PyBenchmark_Start])
|
|
134
|
+
#define PyEndBenchmark (*(int (*)(Benchmark *data)) PyBenchmark_API[PyBenchmark_End])
|
|
135
|
+
#define PyUpdateBenchmark (*(int (*)(MeasureType option, Benchmark *data)) PyBenchmark_API[PyBenchmark_Update])
|
|
136
|
+
#define PyClearBenchmark (*(int (*)(Benchmark *data)) PyBenchmark_API[PyBenchmark_Clear])
|
|
137
|
+
|
|
138
|
+
#define ADD_BENCHMARK_OPTIONS(m) \
|
|
139
|
+
PyModule_AddStringConstant(m, "CpuTime", "CpuTime"); \
|
|
140
|
+
PyModule_AddStringConstant(m, "RealTime", "RealTime"); \
|
|
141
|
+
PyModule_AddStringConstant(m, "Add", "Add"); \
|
|
142
|
+
PyModule_AddStringConstant(m, "Sub", "Sub"); \
|
|
143
|
+
PyModule_AddStringConstant(m, "Mul", "Mul"); \
|
|
144
|
+
PyModule_AddStringConstant(m, "Div", "Div"); \
|
|
145
|
+
PyModule_AddStringConstant(m, "Exp", "Exp");
|
|
146
|
+
|
|
147
|
+
/* end - api helper functions */
|
|
148
|
+
|
|
149
|
+
static int import_benchmark(void)
|
|
150
|
+
{
|
|
151
|
+
// PyBenchmark_API = (void **) PyCapsule_Import(BENCHMARK_MOD_NAME, 1);
|
|
152
|
+
PyBenchmark_API = (void **) PyCapsule_Import(BENCHMARK_MOD_NAME, 0); // 0 = enable tracing
|
|
153
|
+
return (PyBenchmark_API != NULL) ? 0 : -1;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
#endif
|
|
157
|
+
|
|
158
|
+
#ifdef __cplusplus
|
|
159
|
+
}
|
|
160
|
+
#endif
|
|
161
|
+
|
|
162
|
+
#endif /* PY_BENCHMARK_H_ */
|
|
Binary file
|