From 1b5422eb2ddcedd9aabdf4f039144f9eef5c6f95 Mon Sep 17 00:00:00 2001 From: Duke Date: Sat, 6 Jan 2024 22:54:14 -0800 Subject: [PATCH] Dynamically determine thread count for dataset init --- src/miner.cpp | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 4ba24ec29..6f5c1e971 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -1201,14 +1201,27 @@ void static RandomXMiner() rxdebug("%s: initialized cache with keyHeight=%d, randomxBlockKey=%s\n", keyHeight, randomxBlockKey.ToString().c_str()); } - //TODO: this is hardcoded to use 2 threads instead of the number of mining threads - rxdebug("%s: initializing dataset with 2 threads\n"); - std::thread t1(&randomx_init_dataset, randomxDataset, randomxCache, 0, datasetItemCount / 2); - std::thread t2(&randomx_init_dataset, randomxDataset, randomxCache, datasetItemCount / 2, datasetItemCount - datasetItemCount / 2); - t1.join(); - t2.join(); - - // randomx_init_dataset(randomxDataset, randomxCache, 0, datasetItemCount); + int initThreadCount = std::thread::hardware_concurrency(); + if(initThreadCount > 1) { + rxdebug("%s: initializing dataset with %d threads\n", initThreadCount); + std::vector threads; + uint32_t startItem = 0; + auto perThread = datasetItemCount / initThreadCount; + auto remainder = datasetItemCount % initThreadCount; + for (int i = 0; i < initThreadCount; ++i) { + auto count = perThread + (i == initThreadCount - 1 ? remainder : 0); + threads.push_back(std::thread(&randomx_init_dataset, randomxDataset, randomxCache, startItem, count)); + startItem += count; + } + for (unsigned i = 0; i < threads.size(); ++i) { + threads[i].join(); + } + threads.clear(); + } else { + rxdebug("%s: initializing dataset with 1 thread\n"); + randomx_init_dataset(randomxDataset, randomxCache, 0, datasetItemCount); + } + rxdebug("%s: dataset initialized\n"); myVM = randomx_create_vm(flags, nullptr, randomxDataset); @@ -1463,8 +1476,8 @@ void static RandomXMiner() randomx_release_dataset(randomxDataset); rxdebug("%s: released dataset in normal exit\n"); - randomx_release_cache(randomxCache); - rxdebug("%s: released cache in normal exit\n"); + //randomx_release_cache(randomxCache); + //rxdebug("%s: released cache in normal exit\n"); miningTimer.stop(); c.disconnect(); }