From a1d8d8d11a7c6fc1df2c00c08e10a63a23e77878 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 2 Nov 2025 23:12:00 +0000 Subject: [PATCH] update makefile to include all builds --- .gitignore | 5 +++ aad_coin_miner_simd.c | 93 ++++++++++++++++++++++++++++------------- makefile | 30 ++++++++++++- sha1_cuda_kernel.cubin | Bin 13480 -> 0 bytes sha1_tests | Bin 41176 -> 0 bytes 5 files changed, 97 insertions(+), 31 deletions(-) delete mode 100644 sha1_cuda_kernel.cubin delete mode 100755 sha1_tests diff --git a/.gitignore b/.gitignore index f9fec50..7cf9060 100644 --- a/.gitignore +++ b/.gitignore @@ -60,3 +60,8 @@ CMakeUserPresets.json *.ptx *.cubin *.fatbin + +# Coin miner executables +coin_miner_cpu +coin_miner_simd +coin_miner_cuda diff --git a/aad_coin_miner_simd.c b/aad_coin_miner_simd.c index c05ab9a..28405bd 100644 --- a/aad_coin_miner_simd.c +++ b/aad_coin_miner_simd.c @@ -30,39 +30,61 @@ static int is_valid_coin(u32_t *hash) return hash[0] == 0xAAD20250u; } +// +// increment coin variable part using the same logic as CPU miner +// returns 0 if overflow (all positions wrapped around), 1 otherwise +// +static int increment_coin(u32_t coin[14]) +{ + // Increment the variable part using byte-by-byte logic with carry + // Increment from the end to beginning (positions 53 down to 12) + int pos = 53; + while(pos >= 12) + { + u08_t *byte = &((u08_t *)coin)[pos ^ 3]; + if(*byte == '\n' || *byte == 0x80) + *byte = 32; // Start from space + + (*byte)++; + + // Skip newline character + if(*byte == '\n') + (*byte)++; + + // Wrap around at 127 (printable ASCII limit) + if(*byte >= 127) + { + *byte = 32; // Reset to space + pos--; // Carry to next position + } + else + { + break; // No carry needed + } + } + + // Return 0 if we carried all the way through (overflow), 1 otherwise + return (pos >= 12); +} + // // prepare interleaved data for SIMD processing // -static void prepare_coins(u32_t base_coin[14], u32_t *interleaved_data, int simd_width, u64_t base_counter) +static void prepare_coins(u32_t base_coin[14], u32_t *interleaved_data, int simd_width) { for(int lane = 0; lane < simd_width; lane++) { u32_t coin[14]; memcpy(coin, base_coin, sizeof(coin)); - // Modify the coin for this lane (encode counter in the variable part) - u64_t counter = base_counter + lane; - for(int i = 12; i < 20 && i < 54; i++) - { - int shift = (19 - i) * 8; - if(shift >= 0 && shift < 64) - { - u08_t byte = (counter >> shift) & 0xFF; - // Map to ASCII printable range (32-126, excluding newline position) - if(byte == '\n' || byte >= 0x80) - byte = 'X'; - // Ensure byte is in printable ASCII range (32-126) - // Map all values to ASCII printable characters: space (32) to tilde (126) - // byte = 32 + (byte % 95); - ((u08_t *)coin)[i ^ 3] = byte; - } - } - // Interleave the data for(int idx = 0; idx < 14; idx++) { interleaved_data[idx * simd_width + lane] = coin[idx]; } + + // Increment the base coin for the next lane + increment_coin(base_coin); } } @@ -125,19 +147,21 @@ static void mine_coins_avx(u64_t max_attempts) ((u08_t *)base_coin)[0x36 ^ 3] = '\n'; ((u08_t *)base_coin)[0x37 ^ 3] = 0x80; - // Initialize variable part + // Initialize variable part with A-Z cycling pattern (same as CPU miner) for(int i = 12; i < 54; i++) - ((u08_t *)base_coin)[i ^ 3] = 'A'; + ((u08_t *)base_coin)[i ^ 3] = 'A' + (i - 12) % 26; 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(); while(keep_running && (max_attempts == 0 || attempts < max_attempts)) { // Prepare coins for this batch - prepare_coins(base_coin, interleaved_data, SIMD_WIDTH, attempts); + prepare_coins(base_coin, interleaved_data, SIMD_WIDTH); // Compute SHA1 hashes sha1_avx((v4si *)interleaved_data, (v4si *)interleaved_hash); @@ -163,13 +187,16 @@ static void mine_coins_avx(u64_t max_attempts) // Print progress every 1M attempts if(attempts % 1000000 < SIMD_WIDTH) { - printf("Attempts: %llu, Coins: %u\n", - (unsigned long long)attempts, coins_found); + 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); } } time_measurement(); - double total_time = wall_time_delta(); + double total_time = wall_time_delta() - start_time; printf("\n=== Mining Statistics ===\n"); printf("Total attempts: %llu\n", (unsigned long long)attempts); @@ -212,17 +239,20 @@ static void mine_coins_avx2(u64_t max_attempts) ((u08_t *)base_coin)[0x36 ^ 3] = '\n'; ((u08_t *)base_coin)[0x37 ^ 3] = 0x80; + // Initialize variable part with A-Z cycling pattern (same as CPU miner) for(int i = 12; i < 54; i++) - ((u08_t *)base_coin)[i ^ 3] = 'A'; + ((u08_t *)base_coin)[i ^ 3] = 'A' + (i - 12) % 26; 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(); while(keep_running && (max_attempts == 0 || attempts < max_attempts)) { - prepare_coins(base_coin, interleaved_data, SIMD_WIDTH, attempts); + prepare_coins(base_coin, interleaved_data, SIMD_WIDTH); sha1_avx2((v8si *)interleaved_data, (v8si *)interleaved_hash); attempts += SIMD_WIDTH; @@ -244,13 +274,16 @@ static void mine_coins_avx2(u64_t max_attempts) if(attempts % 1000000 < SIMD_WIDTH) { - printf("Attempts: %llu, Coins: %u\n", - (unsigned long long)attempts, coins_found); + 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); } } time_measurement(); - double total_time = wall_time_delta(); + double total_time = wall_time_delta() - start_time; printf("\n=== Mining Statistics ===\n"); printf("Total attempts: %llu\n", (unsigned long long)attempts); diff --git a/makefile b/makefile index a295547..19bf4d2 100644 --- a/makefile +++ b/makefile @@ -32,7 +32,7 @@ OPENCL_DIR = $(CUDA_DIR) # RTX 4070 -------------- sm_89 # -CUDA_ARCH = sm_75 +CUDA_ARCH = sm_86 # @@ -42,6 +42,8 @@ CUDA_ARCH = sm_75 clean: rm -f sha1_tests rm -f sha1_cuda_test sha1_cuda_kernel.cubin + rm -f coin_miner_cpu coin_miner_simd coin_miner_cuda coin_miner_cuda_kernel.cubin + rm -f benchmark rm -f a.out @@ -64,3 +66,29 @@ sha1_cuda_kernel.cubin: aad_sha1_cuda_kernel.cu aad_sha1.h makefile nvcc -arch=$(CUDA_ARCH) --compiler-options -O2,-Wall -I$(CUDA_DIR)/include --cubin $< -o $@ all: sha1_tests sha1_cuda_test sha1_cuda_kernel.cubin + + +# +# DETI coin miners +# + +coin_miner_cpu: aad_coin_miner_cpu.c aad_sha1.h aad_sha1_cpu.h aad_data_types.h aad_utilities.h aad_vault.h makefile + cc -march=native -Wall -Wshadow -Werror -O3 $< -o $@ + +coin_miner_simd: aad_coin_miner_simd.c aad_sha1.h aad_sha1_cpu.h aad_data_types.h aad_utilities.h aad_vault.h makefile + cc -march=native -Wall -Wshadow -Werror -O3 $< -o $@ + +coin_miner_cuda_kernel.cubin: aad_coin_miner_cuda_kernel.cu aad_sha1.h makefile + nvcc -arch=$(CUDA_ARCH) --compiler-options -O2,-Wall -I$(CUDA_DIR)/include --cubin $< -o $@ + +coin_miner_cuda: aad_coin_miner_cuda.c coin_miner_cuda_kernel.cubin aad_sha1.h aad_sha1_cpu.h aad_data_types.h aad_utilities.h aad_vault.h aad_cuda_utilities.h makefile + cc -march=native -Wall -Wshadow -Werror -O3 -I$(CUDA_DIR)/include $< -o $@ -lcuda + +benchmark: aad_benchmark.c aad_sha1.h aad_sha1_cpu.h aad_data_types.h aad_utilities.h makefile + cc -march=native -Wall -Wshadow -Werror -O3 $< -o $@ + +miners: coin_miner_cpu coin_miner_simd coin_miner_cuda benchmark + +all: sha1_tests sha1_cuda_test sha1_cuda_kernel.cubin \ + coin_miner_cpu coin_miner_simd coin_miner_cuda coin_miner_cuda_kernel.cubin \ + benchmark \ No newline at end of file diff --git a/sha1_cuda_kernel.cubin b/sha1_cuda_kernel.cubin deleted file mode 100644 index 957c529f6e10899a21ce364afd6aae08927de783..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13480 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 diff --git a/sha1_tests b/sha1_tests deleted file mode 100755 index b3ee06cb6a109fc797a84ed6ae31ea19bd42c723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41176 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 F{{tUgJj(z8