summaryrefslogtreecommitdiffstats
path: root/xmrstak/backend/nvidia/autoAdjust.hpp
diff options
context:
space:
mode:
authorpsychocrypt <psychocrypt@users.noreply.github.com>2017-09-29 20:32:31 +0200
committerpsychocrypt <psychocrypt@users.noreply.github.com>2017-09-30 23:46:08 +0200
commitcc429b68fadc502b981fd0acd64a5ff6e2ae1d15 (patch)
tree3fb23fc4db15dbdd08af4c7ea20134b9d82e58fd /xmrstak/backend/nvidia/autoAdjust.hpp
parente5b0319d5a9f58762fa934ad700113908940cb31 (diff)
downloadxmr-stak-cc429b68fadc502b981fd0acd64a5ff6e2ae1d15.zip
xmr-stak-cc429b68fadc502b981fd0acd64a5ff6e2ae1d15.tar.gz
group files
- move source code to `src` - categorize files and move to group folder - change upper case class files to lower case - change C++ header to `*.hpp`
Diffstat (limited to 'xmrstak/backend/nvidia/autoAdjust.hpp')
-rw-r--r--xmrstak/backend/nvidia/autoAdjust.hpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/xmrstak/backend/nvidia/autoAdjust.hpp b/xmrstak/backend/nvidia/autoAdjust.hpp
new file mode 100644
index 0000000..84c6dfc
--- /dev/null
+++ b/xmrstak/backend/nvidia/autoAdjust.hpp
@@ -0,0 +1,113 @@
+
+#pragma once
+
+#include "autoAdjust.hpp"
+
+#include "nvcc_code/cryptonight.h"
+#include "jconf.h"
+#include "../../console.h"
+#include "../../ConfigEditor.hpp"
+#include "../../Params.hpp"
+
+#include <vector>
+#include <cstdio>
+#include <sstream>
+#include <string>
+
+
+namespace xmrstak
+{
+namespace nvidia
+{
+
+class autoAdjust
+{
+public:
+
+ autoAdjust()
+ {
+
+ }
+
+ /** print the adjusted values if needed
+ *
+ * Routine exit the application and print the adjusted values if needed else
+ * nothing is happened.
+ */
+ bool printConfig()
+ {
+ int deviceCount = 0;
+ if(cuda_get_devicecount(&deviceCount) == 0)
+ std::exit(0);
+ // evaluate config parameter for if auto adjustment is needed
+ // evaluate config parameter for if auto adjustment is needed
+ for(int i = 0; i < deviceCount; i++)
+ {
+
+ nvid_ctx ctx;
+
+ ctx.device_id = i;
+ // -1 trigger auto adjustment
+ ctx.device_blocks = -1;
+ ctx.device_threads = -1;
+
+ // set all evice option those marked as auto (-1) to a valid value
+#ifndef _WIN32
+ ctx.device_bfactor = 0;
+ ctx.device_bsleep = 0;
+#else
+ // windows pass, try to avoid that windows kills the miner if the gpu is blocked for 2 seconds
+ ctx.device_bfactor = 6;
+ ctx.device_bsleep = 25;
+#endif
+ if( cuda_get_deviceinfo(&ctx) != 1 )
+ {
+ printer::inst()->print_msg(L0, "Setup failed for GPU %d. Exitting.\n", i);
+ std::exit(0);
+ }
+ nvidCtxVec.push_back(ctx);
+
+ }
+
+ generateThreadConfig();
+ return true;
+
+ }
+
+private:
+
+ void generateThreadConfig()
+ {
+ // load the template of the backend config into a char variable
+ const char *tpl =
+ #include "./config.tpl"
+ ;
+
+ ConfigEditor configTpl{};
+ configTpl.set( std::string(tpl) );
+
+ constexpr size_t byte2mib = 1024u * 1024u;
+ std::string conf;
+ int i = 0;
+ for(auto& ctx : nvidCtxVec)
+ {
+ conf += std::string(" // gpu: ") + ctx.name + " architecture: " + std::to_string(ctx.device_arch[0] * 10 + ctx.device_arch[1]) + "\n";
+ conf += std::string(" // memory: ") + std::to_string(ctx.free_device_memory / byte2mib) + "/" + std::to_string(ctx.total_device_memory / byte2mib) + " MiB\n";
+ conf += std::string(" { \"index\" : ") + std::to_string(ctx.device_id) + ",\n" +
+ " \"threads\" : " + std::to_string(ctx.device_threads) + ", \"blocks\" : " + std::to_string(ctx.device_blocks) + ",\n" +
+ " \"bfactor\" : " + std::to_string(ctx.device_bfactor) + ", \"bsleep\" : " + std::to_string(ctx.device_bsleep) + ",\n" +
+ " \"affine_to_cpu\" : false,\n" +
+ " },\n";
+ ++i;
+ }
+
+ configTpl.replace("GPUCONFIG",conf);
+ configTpl.write(Params::inst().configFileNVIDIA);
+ printer::inst()->print_msg(L0, "NVIDIA: GPU configuration stored in file '%s'", Params::inst().configFileNVIDIA.c_str());
+ }
+
+ std::vector<nvid_ctx> nvidCtxVec;
+};
+
+} // namespace nvidia
+} // namepsace xmrstak
OpenPOWER on IntegriCloud