From ecf0ac85cd26e32626c023bcf62e73fba127d737 Mon Sep 17 00:00:00 2001 From: Tiago Garcia Date: Sat, 22 Nov 2025 18:17:07 +0000 Subject: [PATCH] Fix timers Signed-off-by: Tiago Garcia --- .gitignore | 6 ++++ aad_coin_miner_cpu.c | 25 ++++++++------ aad_coin_miner_ocl.c | 79 +++++++++++-------------------------------- aad_coin_miner_simd.c | 58 +++++++++++++++---------------- 4 files changed, 67 insertions(+), 101 deletions(-) diff --git a/.gitignore b/.gitignore index 7cf9060..71332c8 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,9 @@ CMakeUserPresets.json coin_miner_cpu coin_miner_simd coin_miner_cuda +coin_miner_ocl +coin_miner_wasm.js +coin_miner_wasm.wasm + +# Vault +deti_coins*_vault.txt diff --git a/aad_coin_miner_cpu.c b/aad_coin_miner_cpu.c index f13b6be..07b9d00 100644 --- a/aad_coin_miner_cpu.c +++ b/aad_coin_miner_cpu.c @@ -30,6 +30,14 @@ static int is_valid_coin(u32_t *hash) return hash[0] == 0xAAD20250u; } +// Get current wall time in seconds +static double get_wall_time(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (double)ts.tv_sec + (double)ts.tv_nsec * 1.0e-9; +} + // // mine DETI coins using the CPU (no SIMD) // @@ -69,9 +77,7 @@ static void mine_coins_cpu(u64_t max_attempts) printf("Mining DETI coins using CPU (no SIMD)...\n"); printf("Press Ctrl+C to stop\n\n"); - time_measurement(); - time_measurement(); - double start_time = wall_time_delta(); + double start_time = get_wall_time(); while(keep_running && (max_attempts == 0 || attempts < max_attempts)) { @@ -117,16 +123,14 @@ static void mine_coins_cpu(u64_t max_attempts) // Print progress every 1M attempts if(attempts % 1000000 == 0) { - time_measurement(); - double current_time = wall_time_delta() - start_time; - double rate = attempts / current_time; - printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u\n", - (unsigned long long)attempts, rate / 1e6, coins_found); + double elapsed = get_wall_time() - start_time; + double rate = attempts / elapsed; + printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u, Elapsed: %.2fs\n", + (unsigned long long)attempts, rate / 1e6, coins_found, elapsed); } } - time_measurement(); - double total_time = wall_time_delta() - start_time; + double total_time = get_wall_time() - start_time; printf("\n=== Mining Statistics ===\n"); printf("Total attempts: %llu\n", (unsigned long long)attempts); @@ -160,4 +164,3 @@ int main(int argc, char *argv[]) return 0; } - diff --git a/aad_coin_miner_ocl.c b/aad_coin_miner_ocl.c index 55d8f68..31548b3 100644 --- a/aad_coin_miner_ocl.c +++ b/aad_coin_miner_ocl.c @@ -32,6 +32,14 @@ static void reconstruct_coin(u32_t *stored_data, u32_t coin[14]) coin[i] = stored_data[i]; } +// Get current wall time in seconds +static double get_wall_time(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (double)ts.tv_sec + (double)ts.tv_nsec * 1.0e-9; +} + // // Mine DETI coins using OpenCL // @@ -57,7 +65,7 @@ static void mine_coins_ocl(u64_t max_attempts, int use_scan_kernel) // Kernel configuration od.local_work_size = RECOMMENDED_OCL_WORK_GROUP_SIZE; - od.global_work_size = 4096 * od.local_work_size; // Large grid for maximum GPU utilization + od.global_work_size = 4096 * od.local_work_size; u32_t n_threads = od.global_work_size; @@ -68,58 +76,16 @@ static void mine_coins_ocl(u64_t max_attempts, int use_scan_kernel) printf("Kernel: %s\n", od.kernel_name); printf("Press Ctrl+C to stop\n\n"); - // Test SHA1 on host to verify it matches - printf("Testing SHA1 implementation on host...\n"); - u32_t test_coin[14]; - memset(test_coin, 0, sizeof(test_coin)); - ((u08_t *)test_coin)[0x0 ^ 3] = 'D'; - ((u08_t *)test_coin)[0x1 ^ 3] = 'E'; - ((u08_t *)test_coin)[0x2 ^ 3] = 'T'; - ((u08_t *)test_coin)[0x3 ^ 3] = 'I'; - ((u08_t *)test_coin)[0x4 ^ 3] = ' '; - ((u08_t *)test_coin)[0x5 ^ 3] = 'c'; - ((u08_t *)test_coin)[0x6 ^ 3] = 'o'; - ((u08_t *)test_coin)[0x7 ^ 3] = 'i'; - ((u08_t *)test_coin)[0x8 ^ 3] = 'n'; - ((u08_t *)test_coin)[0x9 ^ 3] = ' '; - ((u08_t *)test_coin)[0xa ^ 3] = '2'; - ((u08_t *)test_coin)[0xb ^ 3] = ' '; - ((u08_t *)test_coin)[0x36 ^ 3] = '\n'; - ((u08_t *)test_coin)[0x37 ^ 3] = 0x80; - for(int i = 12; i < 54; i++) - ((u08_t *)test_coin)[i ^ 3] = 'A' + (i - 12) % 26; - - u32_t test_hash[5]; - sha1(test_coin, test_hash); - printf("Host test hash: 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\n", - test_hash[0], test_hash[1], test_hash[2], test_hash[3], test_hash[4]); - - // Now test on device - printf("Testing SHA1 implementation on device...\n"); - host_storage[0] = 1u; - - // Put the test coin in storage starting at index 1 - for(int i = 0; i < 14; i++) - host_storage[1 + i] = test_coin[i]; - - // Copy to device - host_to_device_copy(&od, 0); - - // We'll add a test kernel - for now just verify basic kernel launch works - printf("Starting mining...\n\n"); - u32_t param1 = (u32_t)time(NULL); u32_t param2 = 0x12345678u; int scan_pos = 12; - time_measurement(); - time_measurement(); - double start_time = wall_time_delta(); + double start_time = get_wall_time(); while(keep_running && (max_attempts == 0 || attempts < max_attempts)) { // Initialize storage area - host_storage[0] = 1u; // First unused index + host_storage[0] = 1u; // Copy to device host_to_device_copy(&od, 0); @@ -139,7 +105,6 @@ static void mine_coins_ocl(u64_t max_attempts, int use_scan_kernel) device_to_host_copy(&od, 0); // Process found coins - u32_t n_coins_this_kernel = 0; u32_t n_stored = (host_storage[0] - 1) / 14; if(n_stored > 0 && host_storage[0] < COINS_STORAGE_SIZE) @@ -156,9 +121,7 @@ static void mine_coins_ocl(u64_t max_attempts, int use_scan_kernel) if(hash[0] == 0xAAD20250u) { coins_found++; - n_coins_this_kernel++; - printf("COIN FOUND! (kernel %u, coin %u in this kernel)\n", - kernel_runs, n_coins_this_kernel); + printf("COIN FOUND! (kernel %u)\n", kernel_runs); save_coin(coin); } } @@ -167,7 +130,7 @@ static void mine_coins_ocl(u64_t max_attempts, int use_scan_kernel) // Update counters kernel_runs++; if(use_scan_kernel) - attempts += n_threads * 256; // Each thread tries 256 values + attempts += n_threads * 95; // Each thread tries 95 printable ASCII values else attempts += n_threads; @@ -175,21 +138,19 @@ static void mine_coins_ocl(u64_t max_attempts, int use_scan_kernel) param1++; param2 = param2 ^ 0x9E3779B9u; if(use_scan_kernel) - scan_pos = (scan_pos + 1) % 42 + 12; // Cycle through positions 12-53 + scan_pos = (scan_pos + 1) % 42 + 12; // Print progress every 10 kernel launches if(kernel_runs % 10 == 0) { - time_measurement(); - double current_time = wall_time_delta() - start_time; - double rate = attempts / current_time; - printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u, Kernels: %u\n", - (unsigned long long)attempts, rate / 1e6, coins_found, kernel_runs); + double elapsed = get_wall_time() - start_time; + double rate = attempts / elapsed; + printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u, Kernels: %u, Elapsed: %.2fs\n", + (unsigned long long)attempts, rate / 1e6, coins_found, kernel_runs, elapsed); } } - time_measurement(); - double total_time = wall_time_delta() - start_time; + double total_time = get_wall_time() - start_time; printf("\n=== Mining Statistics ===\n"); printf("Total attempts: %llu\n", (unsigned long long)attempts); @@ -217,7 +178,7 @@ int main(int argc, char *argv[]) if(argc > 2 && strcmp(argv[2], "scan") == 0) { use_scan_kernel = 1; - printf("Using scan kernel (tries 256 values per thread)\n"); + printf("Using scan kernel (tries 95 values per thread)\n"); } mine_coins_ocl(max_attempts, use_scan_kernel); diff --git a/aad_coin_miner_simd.c b/aad_coin_miner_simd.c index 24c1195..42c409a 100644 --- a/aad_coin_miner_simd.c +++ b/aad_coin_miner_simd.c @@ -30,6 +30,14 @@ static int is_valid_coin(u32_t *hash) return hash[0] == 0xAAD20250u; } +// Get current wall time in seconds +static double get_wall_time(void) +{ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (double)ts.tv_sec + (double)ts.tv_nsec * 1.0e-9; +} + // // increment coin variable part using the same logic as CPU miner // returns 0 if overflow (all positions wrapped around), 1 otherwise @@ -154,9 +162,7 @@ static void mine_coins_avx(u64_t max_attempts) printf("Mining DETI coins using AVX (4-way SIMD)...\n"); printf("Press Ctrl+C to stop\n\n"); - time_measurement(); - time_measurement(); - double start_time = wall_time_delta(); + double start_time = get_wall_time(); while(keep_running && (max_attempts == 0 || attempts < max_attempts)) { @@ -187,16 +193,14 @@ static void mine_coins_avx(u64_t max_attempts) // Print progress every 1M attempts if(attempts % 1000000 < SIMD_WIDTH) { - time_measurement(); - double current_time = wall_time_delta() - start_time; - double rate = attempts / current_time; - printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u\n", - (unsigned long long)attempts, rate / 1e6, coins_found); + double elapsed = get_wall_time() - start_time; + double rate = attempts / elapsed; + printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u, Elapsed: %.2fs\n", + (unsigned long long)attempts, rate / 1e6, coins_found, elapsed); } } - time_measurement(); - double total_time = wall_time_delta() - start_time; + double total_time = get_wall_time() - start_time; printf("\n=== Mining Statistics ===\n"); printf("Total attempts: %llu\n", (unsigned long long)attempts); @@ -246,9 +250,7 @@ static void mine_coins_avx2(u64_t max_attempts) printf("Mining DETI coins using AVX2 (8-way SIMD)...\n"); printf("Press Ctrl+C to stop\n\n"); - time_measurement(); - time_measurement(); - double start_time = wall_time_delta(); + double start_time = get_wall_time(); while(keep_running && (max_attempts == 0 || attempts < max_attempts)) { @@ -274,16 +276,14 @@ static void mine_coins_avx2(u64_t max_attempts) if(attempts % 1000000 < SIMD_WIDTH) { - time_measurement(); - double current_time = wall_time_delta() - start_time; - double rate = attempts / current_time; - printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u\n", - (unsigned long long)attempts, rate / 1e6, coins_found); + double elapsed = get_wall_time() - start_time; + double rate = attempts / elapsed; + printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u, Elapsed: %.2fs\n", + (unsigned long long)attempts, rate / 1e6, coins_found, elapsed); } } - time_measurement(); - double total_time = wall_time_delta() - start_time; + double total_time = get_wall_time() - start_time; printf("\n=== Mining Statistics ===\n"); printf("Total attempts: %llu\n", (unsigned long long)attempts); @@ -294,6 +294,7 @@ static void mine_coins_avx2(u64_t max_attempts) save_coin(NULL); } #endif + #if defined(__AVX2__) #include // @@ -310,16 +311,13 @@ static void mine_coins_avx2_omp(u64_t max_attempts) printf("Mining DETI coins using AVX2 (8-way SIMD) + OpenMP (%d threads)...\n", num_threads); printf("Press Ctrl+C to stop\n\n"); - time_measurement(); - time_measurement(); - double start_time = wall_time_delta(); + double start_time = get_wall_time(); #pragma omp parallel { u32_t base_coin[14]; u32_t interleaved_data[14 * SIMD_WIDTH] __attribute__((aligned(32))); u32_t interleaved_hash[5 * SIMD_WIDTH] __attribute__((aligned(32))); - // u32_t thread_coins_found = 0; u64_t thread_attempts = 0; // Initialize base coin template (unique per thread) @@ -375,11 +373,10 @@ static void mine_coins_avx2_omp(u64_t max_attempts) { #pragma omp critical { - time_measurement(); - double current_time = wall_time_delta() - start_time; - double rate = (attempts + thread_attempts) / current_time; - printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u\n", - (unsigned long long)(attempts + thread_attempts), rate / 1e6, coins_found); + double elapsed = get_wall_time() - start_time; + double rate = (attempts + thread_attempts) / elapsed; + printf("Attempts: %llu, Rate: %.2f MH/s, Coins: %u, Elapsed: %.2fs\n", + (unsigned long long)(attempts + thread_attempts), rate / 1e6, coins_found, elapsed); } } } @@ -388,8 +385,7 @@ static void mine_coins_avx2_omp(u64_t max_attempts) attempts += thread_attempts; } - time_measurement(); - double total_time = wall_time_delta() - start_time; + double total_time = get_wall_time() - start_time; printf("\n=== Mining Statistics ===\n"); printf("Total attempts: %llu\n", (unsigned long long)attempts);