update gpu code

This commit is contained in:
wowario
2025-09-26 11:33:04 +03:00
parent 65e649255b
commit 33b7060fa2
2 changed files with 23 additions and 24 deletions
+2 -1
View File
@@ -62,7 +62,8 @@ if (WBAG_CUDA)
CUDA_STANDARD 17
CUDA_STANDARD_REQUIRED YES
POSITION_INDEPENDENT_CODE ON)
target_link_libraries(wbag_gpu_bench PRIVATE CUDA::cudart common cncrypto cryptonote_basic)
target_link_libraries(wbag_gpu_bench PRIVATE CUDA::cudart CUDA::cuda_driver common cncrypto cryptonote_basic)
target_compile_definitions(hash-tests PRIVATE WBAG_HAVE_WBAG_GPU_BENCH=1)
target_link_libraries(hash-tests PRIVATE wbag_gpu_bench)
+21 -23
View File
@@ -1,4 +1,5 @@
#include <cuda_runtime.h>
#include <cuda.h>
#include <cstdint>
#include <cstdio>
#include <vector>
@@ -130,6 +131,14 @@ static inline int parse_resident_mode_env() {
#endif
}
static inline int cu_fail(CUresult r, const char* where){
if (r == CUDA_SUCCESS) return 0;
const char* name = nullptr; const char* desc = nullptr;
cuGetErrorName(r, &name); cuGetErrorString(r, &desc);
std::fprintf(stderr, "CUDA driver %s: %s (%s)\n", where, name ? name : "err", desc ? desc : "");
return 1;
}
int wbag_gpu_bench_once(const cryptonote::wbag::CacheView& view, int threads, int trials, double& hashes_per_sec_out)
{
if (threads <= 0 || trials <= 0) return 1;
@@ -137,14 +146,16 @@ int wbag_gpu_bench_once(const cryptonote::wbag::CacheView& view, int threads, in
int devs = 0;
cudaError_t st = cudaGetDeviceCount(&devs);
if (st != cudaSuccess || devs <= 0) {
std::fprintf(stderr, "CUDA get device count: %s\n", cudaGetErrorString(st));
return 100;
if (cu_fail(cuInit(0), "cuInit")) return 100;
int dcount = 0;
if (cu_fail(cuDeviceGetCount(&dcount), "cuDeviceGetCount")) return 100;
if (dcount <= 0) { std::fprintf(stderr, "CUDA driver reports 0 devices\n"); return 100; }
CUdevice dev; if (cu_fail(cuDeviceGet(&dev, 0), "cuDeviceGet(0)")) return 101;
CUcontext ctx; if (cu_fail(cuDevicePrimaryCtxRetain(&ctx, dev), "cuDevicePrimaryCtxRetain")) return 101;
if (cu_fail(cuCtxSetCurrent(ctx), "cuCtxSetCurrent")) return 101;
}
st = cudaSetDevice(0);
if (st != cudaSuccess) {
std::fprintf(stderr, "CUDA set device: %s\n", cudaGetErrorString(st));
return 101;
}
if (st != cudaSuccess) { std::fprintf(stderr, "CUDA set device: %s\n", cudaGetErrorString(st)); return 101; }
const size_t entry_bytes = WBAG_entry_bytes();
const size_t cache_bytes = view.size();
@@ -160,16 +171,9 @@ int wbag_gpu_bench_once(const cryptonote::wbag::CacheView& view, int threads, in
if (!d_cache || d_cache_size != cache_bytes) {
if (d_cache) { cudaFree(d_cache); d_cache = nullptr; d_cache_size = 0; }
st = cudaMalloc(&d_cache, cache_bytes);
if (st != cudaSuccess) {
std::fprintf(stderr, "GPU: cache alloc failed (%zu bytes): %s\n", cache_bytes, cudaGetErrorString(st));
return 2;
}
if (st != cudaSuccess) { std::fprintf(stderr, "GPU: cache alloc failed (%zu bytes): %s\n", cache_bytes, cudaGetErrorString(st)); return 2; }
st = cudaMemcpy(d_cache, view.data(), cache_bytes, cudaMemcpyHostToDevice);
if (st != cudaSuccess) {
std::fprintf(stderr, "GPU: cache memcpy failed: %s\n", cudaGetErrorString(st));
cudaFree(d_cache); d_cache = nullptr; d_cache_size = 0;
return 3;
}
if (st != cudaSuccess) { std::fprintf(stderr, "GPU: cache memcpy failed: %s\n", cudaGetErrorString(st)); cudaFree(d_cache); d_cache = nullptr; d_cache_size = 0; return 3; }
d_cache_size = cache_bytes;
}
@@ -178,10 +182,7 @@ int wbag_gpu_bench_once(const cryptonote::wbag::CacheView& view, int threads, in
size_t free_b = 0, total_b = 0;
st = cudaMemGetInfo(&free_b, &total_b);
if (st != cudaSuccess) {
std::fprintf(stderr, "GPU: mem info failed: %s\n", cudaGetErrorString(st));
return 4;
}
if (st != cudaSuccess) { std::fprintf(stderr, "GPU: mem info failed: %s\n", cudaGetErrorString(st)); return 4; }
if (need_resident + (64ULL << 20) > free_b) {
std::fprintf(stderr, "GPU: not enough VRAM for resident (%zu MiB needed, %zu MiB free). Set WBAG_GPU_RESIDENT=shared or reduce --threads.\n", need_resident >> 20, free_b >> 20);
return 5;
@@ -189,10 +190,7 @@ int wbag_gpu_bench_once(const cryptonote::wbag::CacheView& view, int threads, in
uint8_t* d_resident = nullptr;
st = cudaMalloc(&d_resident, need_resident);
if (st != cudaSuccess) {
std::fprintf(stderr, "GPU: resident alloc failed (%zu bytes): %s\n", need_resident, cudaGetErrorString(st));
return 6;
}
if (st != cudaSuccess) { std::fprintf(stderr, "GPU: resident alloc failed (%zu bytes): %s\n", need_resident, cudaGetErrorString(st)); return 6; }
const uint64_t base_seed = WBAG_resident_seed_from_cache(view.data(), view.size());