From 4ce7cbb6e301c842a49f2a7153ed8d2d193e5d19 Mon Sep 17 00:00:00 2001 From: droghio Date: Wed, 21 Oct 2015 12:08:55 -0400 Subject: [PATCH 01/17] Minor tweaks to the source to make it more user friendly. Prompts user to unlock wallet and open siad if it detects an HTTP 400 Error. Added Release_README with basic setup, usage, and troubleshooting steps. --- Release_README.txt | 60 ++++++++++++++++++++++++++++++++++++++++++++++ network.c | 3 +++ sia-gpu-miner.c | 2 +- 3 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 Release_README.txt diff --git a/Release_README.txt b/Release_README.txt new file mode 100644 index 0000000..a534bc0 --- /dev/null +++ b/Release_README.txt @@ -0,0 +1,60 @@ +README + +Miner v1.0.3 +October 16, 2015 +=============== + +The source code for the miner (and Sia as a whole) comes from Nebulous Labs, +check out their website for more info: https://siacoin.com/ + +This readme assumes you downloaded the latest release from the following link. It does not cover compiling from source: + https://github.com/droghio/Sia-GPU-Miner/releases + +Anyhow this is the latest Windows build of the Sia-GPU-Miner dubbed version v1.0.3. +Assuming everything unzipped correctly you should have the following five files. + - README (That's me.) + - LICENSE + - sia-gpu-miner.exe + - sia-gpu-miner.cl + - libcurl.dll + +If you are missing any of these files you have a problem, +try redownloading the binary from my github: + https://github.com/droghio/Sia-GPU-Miner/releases + +If you are still missing things (probably libcurl.dll) you might want to make sure your antivirus isn't +messing with your zip file. Norton is notorious for killing dlls without consent. + +If the miner fails to load make sure you have the 2012 MS Redistributable installed: + https://www.microsoft.com/en-us/download/details.aspx?id=30679 + +Other hints and tips: + 1. MAKE SURE YOU CHANGE THE INTENSITY! + I upped the default intensity to 20 but make sure you + change this if your care can take it! I'm talking about + a 200+MH/s mining rate difference for a proper intensity value. + I use an intensity of 27 on my 7970 and get about 770MH/s on a hefty overclock. + + To change this you'll need to launch the miner from a command prompt. + a. Hit the Windows key start typing "cmd". + You should see an app called Command Prompt + + b. After opening the command prompt type "cd " into the black window then + click and drag the folder where the sia-gpu-miner.exe lives into the window. + + You should see something like: + C:\>cd C:\Users\John\Downloads\sia-gpu-miner.exe + + c. Press enter, then type "sia-gpu-miner.exe -I 27" where you replace the "27" with + whatever intensity works best for your card. Too low and you aren't using + your card's full potential, too high and you get diminishing returns. + + 2. If you get an "HTTP error 400" make sure the Sia UI or siad is running AND you have unlocked your wallet. + + 3. I compile the binary against AMD's OpenCL libs and this is a 64 bit binary meaning it won't run + on older machines. Even though I am using AMD's libs I have tested this program on a Nvidia 970 + and got good hash rates (~1MH/s) so you should be fine using either brand of card. + + +If you have any questions concerns etc feel free to reach out to me via email or irc (freenode). In the mean time happy mining! + - droghio \ No newline at end of file diff --git a/network.c b/network.c index 877ef8f..f4964ab 100644 --- a/network.c +++ b/network.c @@ -31,6 +31,9 @@ int check_http_response(CURL *curl) { curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); if (http_code != 200) { fprintf(stderr, "HTTP error %lu\n", http_code); + if (http_code == 400){ + fprintf(stderr, "\tMake sure you unlock your wallet before running the miner!\n"); + } return 1; } return 0; diff --git a/sia-gpu-miner.c b/sia-gpu-miner.c index d1d74e2..1a47609 100644 --- a/sia-gpu-miner.c +++ b/sia-gpu-miner.c @@ -33,7 +33,7 @@ // Max of 2^32 so that people can't send an hour of work to the GPU at one time #define MIN_INTENSITY 8 #define MAX_INTENSITY 32 -#define DEFAULT_INTENSITY 16 +#define DEFAULT_INTENSITY 20 // Number of times the GPU kernel is called between updating the command line text #define MIN_CPI 1 // Must do one call per update From f7feb4742ab073f39be5756536dc4e1a46da5b9a Mon Sep 17 00:00:00 2001 From: John Drogo Date: Wed, 21 Oct 2015 12:14:07 -0400 Subject: [PATCH 02/17] Update README.md Small changes to make it a more Windows friendly world. --- README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6c4ac77..425766e 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ A GPU miner designed for mining siacoins. This miner runs in a command prompt and prints your hashrate along side the number of blocks you've mined. Most cards will see greatly increased hashrates by increasing the value of 'I' -(default is 16, optimal is typically 20-25). +(default is 20, optimal is typically 20-28). ## How to Use -1) Build the miner by running `make`. +1) Download the latest build from: https://github.com/droghio/Sia-GPU-Miner/releases -2) Make sure you have a recent version of Sia installed and running. +2) Make sure you have a recent version of Sia installed and running. Don't forget to unlock your wallet. -3) Run the miner by running `./gpu-miner`. It will mine blocks until killed with Ctrl-C. +3) Run the miner by double clicking the `gpu-miner.exe`. It will mine blocks until killed with Ctrl-C. ## Configuration You can tweak the miner settings with five command-line arguments: `-I`, `-C`, `-p`, `-d`, and `-P`. @@ -30,7 +30,7 @@ You can tweak the miner settings with five command-line arguments: `-I`, `-C`, ` configured Sia to be on a port other than the default. Default is 9980. If you wanted to run the program on platform 0, device 1, with an intensity of -24, you would call `./sia-gpu-miner -d 1 -I 24` +24, you would call `sia-gpu-miner -d 1 -I 24` ## Multiple GPUs Each instance of the miner can only point to a single GPU. To mine on multiple @@ -44,8 +44,7 @@ updating one time per [numGPUs] seconds. You should not mine with more than 6 cards at a time (per instance of siad). ## Notes -* Each Sia block takes about 10 minutes to mine. +* Each Sia block takes about a week or so to mine. * Once a block is mined, Sia waits for 144 confirmation blocks before the reward is added to your wallet, which takes about 24 hours. * Sia currently doesn't have any mining pools. -* Windows is poorly supported. For best results, use Linux when mining. From 9f738d68d24fabc78a382a2fee2d828d4487ff52 Mon Sep 17 00:00:00 2001 From: John Drogo Date: Wed, 21 Oct 2015 12:16:24 -0400 Subject: [PATCH 03/17] Update README.md Fixed a couple minor typos. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 425766e..329af7d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ You can tweak the miner settings with five command-line arguments: `-I`, `-C`, ` * -I controls the intensity. On each GPU call, the GPU will do 2^I hashes. The default value is low to prevent certain GPUs from crashing immediately at startup. Most cards will benefit substantially from increasing the value. The - default is 16, but reccommended (for most cards) is 20-25. + default is 20, but recommended (for most cards) is 20-28. * -C controls how frequently calls to siad are made. Reducing it substantially could cause instability to the miner. Increasing it will reduce the frequency at which the hashrate is updated. If a low 'I' is being used, a high 'C' From 4fac6ecb9a492bc812a3522ecce70397fa0476bd Mon Sep 17 00:00:00 2001 From: droghio Date: Thu, 22 Oct 2015 22:39:00 -0400 Subject: [PATCH 04/17] It actaully kindof works on Mac. --- Makefile | 28 -- assets/button.png | Bin 0 -> 258 bytes css/overview.css | 29 ++ index.html | 32 +++ js/buttons.js | 65 +++++ js/gpu-miner.js | 97 +++++++ sia-gpu-miner.c | 571 ------------------------------------- sia-gpu-miner.cl | 70 ----- network.c => src/network.c | 0 network.h => src/network.h | 0 10 files changed, 223 insertions(+), 669 deletions(-) delete mode 100644 Makefile create mode 100644 assets/button.png create mode 100644 css/overview.css create mode 100644 index.html create mode 100644 js/buttons.js create mode 100644 js/gpu-miner.js delete mode 100644 sia-gpu-miner.c delete mode 100644 sia-gpu-miner.cl rename network.c => src/network.c (100%) rename network.h => src/network.h (100%) diff --git a/Makefile b/Makefile deleted file mode 100644 index cb1bb10..0000000 --- a/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -ifeq ($(shell uname -s),Darwin) - CC ?= clang - LDLIBS += -lcurl -framework OpenCL -else - CC ?= gcc - LDLIBS += -lOpenCL -lcurl -endif - -CFLAGS += -c -std=c11 -Wall -pedantic -O2 - -TARGET = sia-gpu-miner - -SOURCES = sia-gpu-miner.c network.c - -OBJECTS = $(patsubst %.c,%.o,$(SOURCES)) - -all: $(TARGET) - -%.o: %.c - $(CC) $(CFLAGS) -o $@ $< - -$(TARGET): $(OBJECTS) - $(CC) -o $@ $^ $(LDLIBS) - -clean: - rm -f $(TARGET) $(OBJECTS) - -.PHONY: all clean diff --git a/assets/button.png b/assets/button.png new file mode 100644 index 0000000000000000000000000000000000000000..5e214df34fb51fea5f06209010bb1f2949b5f37a GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Cp}#pLn`LHy|Iz^kb#KnMebw+ zhE%q6_8SZ$S#FM||K8^v_-A{EP5kXPEz@L z%56pCLT?#q#hezS!}E4DD0p98zT&W(#`i_NAnp8eVcPGT6nRRGfSzLTboFyt=akR{ E0D`Y%`~Uy| literal 0 HcmV?d00001 diff --git a/css/overview.css b/css/overview.css new file mode 100644 index 0000000..609622d --- /dev/null +++ b/css/overview.css @@ -0,0 +1,29 @@ +/* Style Guide: + * Transparent: 70% Opacity + * + * White: #FFFFFF + * Grey-White: #F5F5F5 + * Faint-Grey: #ECECEC + * Light-Grey: #DDDDDD + * Grey: #C5C5C5 + * Grey-Black: #4A4A4A + * Black: #000000 + */ +.frame { + color: #f5f5f5; +} +.welcome { + -webkit-animation: fadein 3s; + position: relative; + top: 35%; + transform: translateY(-35%); + text-align: center; + color: #c5c5c5; +} +.welcome .large { + font-size: 72px; +} +.welcome .small { + margin-top: 20px; + font-size: 32px; +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..12f8a5c --- /dev/null +++ b/index.html @@ -0,0 +1,32 @@ + + + + + + + + + + + +
+ +
+
Sia GPU Miner
+
+
Miner is Idle
+
GPU Blocks Mined: 0
+
Hash Rate: 0
+ +
+
+ +
Start GPU Miner!
+ +
+ + + + + + diff --git a/js/buttons.js b/js/buttons.js new file mode 100644 index 0000000..d6a4581 --- /dev/null +++ b/js/buttons.js @@ -0,0 +1,65 @@ +// buttons.js +// +// Bindings for buttons in html view. +// +// +// October 22, 2015 +// John Drogo +// + +const Process = require("child_process").spawn +const path = require("path") + +basedir = window.location.pathname + +var elByID = function (text){ return document.getElementById(text) } +var minerstatus = "idle" +var blocksmined = 0 +var hashrate = 0 + +var miner + +function minerMessage(text){ + elByID("mineroutput").innerHTML = text + elByID("mineroutput").innerHTML +} + +function minerUpdateStatus(){ + //Update status text. + elByID("minerstatus").innerHTML = + (minerstatus == "idle" ? "Miner is Idle" : "Miner is Mining") + + + elByID("gpublocks").innerHTML = "GPU Blocks Mined: " + blocksmined + elByID("hashrate").innerHTML = "Hash Rate: " + hashrate +} + +elByID("toggleminer").onclick = function (){ + if (minerstatus == "idle"){ + //Launch the miner! + miner = Process( + path.resolve(basedir, "../assets/sia-gpu-miner"),{ + stdio: [ "ignore", "pipe", "pipe" ], + cwd: path.resolve(basedir, "../assets") + }) + + + miner.stdout.on('data', function (data) { + console.log('stdout: ' + data); + minerMessage(data) + + }); + + miner.stderr.on('data', function (data) { + console.log('stderr: ' + data); + minerMessage(data) + }); + + miner.on('close', function (code) { + console.log("Miner closed."); + minerstatus = idle + miner = undefined + minerMessage("Miner stopped.") + minerUpdateStatus() + }); + } +} diff --git a/js/gpu-miner.js b/js/gpu-miner.js new file mode 100644 index 0000000..f3f81e8 --- /dev/null +++ b/js/gpu-miner.js @@ -0,0 +1,97 @@ +'use strict'; +// Library for communicating with Sia-UI +const IPC = require('ipc'); +// Library for arbitrary precision in numbers +const BigNumber = require('../../js/bignumber.min.js'); +// Ensure precision +BigNumber.config({ DECIMAL_PLACES: 24 }); +BigNumber.config({ EXPONENTIAL_AT: 1e+9 }); +// Keeps track of if the view is shown +var updating; + +// Make API calls, sending a channel name to listen for responses +function update() { + IPC.sendToHost('api-call', '/wallet', 'wallet-update'); + IPC.sendToHost('api-call', '/gateway/status', 'peers-update'); + IPC.sendToHost('api-call', '/consensus', 'height-update'); + updating = setTimeout(update, 5000); +} + +// Updates element text +function updateField(err, caption, value, elementID) { + if (err) { + IPC.sendToHost('notify', 'API call errored!', 'error'); + } else if (value === null) { + IPC.sendToHost('notify', 'API result seems to be null!', 'error'); + } else { + document.getElementById(elementID).innerHTML = caption + value; + } +} + +// Convert to Siacoin +function formatSiacoin(hastings) { + // TODO: JS automatically loses precision when taking numbers from the API. + // This deals with that imperfectly, rounding to nearest hasting + var number = new BigNumber(hastings); + var ConversionFactor = new BigNumber(10).pow(24); + // Display two digits of Siacoin + var display = number.dividedBy(ConversionFactor).round(2) + ' S'; + return display; +} + +// Called by the UI upon showing +function start() { + // DEVTOOL: uncomment to bring up devtools on plugin view + IPC.sendToHost('devtools'); + + // Call the API + update(); +} + +// Called by the UI upon transitioning away from this view +function stop() { + clearTimeout(updating); +} + +// Ask UI to show tooltip bubble +function tooltip(message, element) { + var rect = element.getBoundingClientRect(); + IPC.sendToHost('tooltip', message, { + top: rect.top, + bottom: rect.bottom, + left: rect.left, + right: rect.right, + height: rect.height, + width: rect.width, + length: rect.length, + }); +} + +// Define IPC listeners and update DOM per call +IPC.on('wallet-update', function(err, result) { + if(!result){ + return; + } + + var unlocked = result.unlocked; + var encrypted = result.encrypted; + if (!encrypted) { + updateField(err, 'New Wallet', '', 'lock'); + } else if (unlocked) { + updateField(err, 'Unlocked', '', 'lock'); + } else { + updateField(err, 'Locked', '', 'lock'); + } + + var bal = formatSiacoin(result.confirmedsiacoinbalance); + updateField(err, 'Balance: ', unlocked ? bal : '---', 'balance'); +}); +IPC.on('peers-update', function(err, result) { + var value = result !== null ? result.Peers.length : null; + updateField(err, 'Peers: ', value, 'peers'); +}); +IPC.on('height-update', function(err, result) { + var value = result !== null ? result.height : null; + updateField(err, 'Block Height: ', value, 'height'); +}); + diff --git a/sia-gpu-miner.c b/sia-gpu-miner.c deleted file mode 100644 index 1a47609..0000000 --- a/sia-gpu-miner.c +++ /dev/null @@ -1,571 +0,0 @@ -/* - * A cross-platform GPU miner built for Sia - * using OpenCL for interacting with the graphics card - * and libcurl for interacting with the Sia daemon. - */ - -// Some linux distros need a different timer. -#ifdef __linux__ -#define _GNU_SOURCE -#define _POSIX_SOURCE -#include -#endif - -// OpenCL headers are different for Apple. -#ifdef __APPLE__ -#include -#else -#include -#endif - -#include -#include -#include -#include -#include -#include - -#include "network.h" - -// 2^intensity hashes are calculated each time the kernel is called -// Minimum of 2^8 (256) because our default local_item_size is 256 -// global_item_size (2^intensity) must be a multiple of local_item_size -// Max of 2^32 so that people can't send an hour of work to the GPU at one time -#define MIN_INTENSITY 8 -#define MAX_INTENSITY 32 -#define DEFAULT_INTENSITY 20 - -// Number of times the GPU kernel is called between updating the command line text -#define MIN_CPI 1 // Must do one call per update -#define MAX_CPI 65536 // 2^16 is a slightly arbitrary max -#define DEFAULT_CPI 30 - -// The maximum size of the .cl file we read in and compile -#define MAX_SOURCE_SIZE (0x200000) - -// Objects needed to call the kernel -// global namespace so our grindNonce function can access them -cl_command_queue command_queue = NULL; -cl_kernel kernel = NULL; -cl_int ret; - -// mem objects for storing our kernel parameters -cl_mem blockHeadermobj = NULL; -cl_mem nonceOutmobj = NULL; - -// More gobal variables the grindNonce needs to access -size_t local_item_size = 256; // Size of local work groups. 256 is usually optimal -unsigned int blocks_mined = 0; -unsigned int intensity = DEFAULT_INTENSITY; -static volatile int quit = 0; - -// If we get a corrupt target, we want to remember so that if subsequent curl calls -// reutrn more corrupt targets, we don't spam the cmd line with errors -int target_corrupt_flag = 0; - -// Set quit variable when SIGINT is received so we can do proper cleanup -void quitSignal(int unused) { - (void)unused; // prevents clang from complaining about an unused variable. - quit = 1; - printf("\nCaught kill signal, quitting...\n"); -} - -// Given a number of cycles per iter, grind nonces will poll Sia for a block -// then do 2^intensity hashes cycles_per_iter times, checking for a successful -// hash each time -// Returns -1 if it finds a block, otherwise it returns the hash_rate of the GPU -double grindNonces(int cycles_per_iter) { - // Start timing this iteration. - #ifdef __linux__ - struct timespec begin, end; - clock_gettime(CLOCK_REALTIME, &begin); - #else - clock_t startTime = clock(); - #endif - - uint8_t blockHeader[80]; - uint8_t target[32] = {255}; - uint8_t nonceOut[8] = {0}; - - // Get new block header and target. - if (get_header_for_work(target, blockHeader) != 0) { - return -1; - } - - // Check for target corruption. - int i; - if (target[0] != 0 || target[1] != 0) { - if (target_corrupt_flag) { - return -1; - } - target_corrupt_flag = 1; - printf("Received corrupt target from Sia\n"); - printf("Waiting for problem to be resolved..."); - fflush(stdout); - return -1; - } - target_corrupt_flag = 0; - size_t global_item_size = 1 << intensity; - - // Copy target to header. - for (i = 0; i < 8; i++) { - blockHeader[i + 32] = target[7-i]; - } - - // By doing a bunch of low intensity calls, we prevent freezing - // By splitting them up inside this function, we also avoid calling - // get_block_for_work too often. - for (i = 0; i < cycles_per_iter; i++) { - // Offset global ids so that each loop call tries a different set of - // hashes. - size_t globalid_offset = i * global_item_size; - - // Copy input data to the memory buffer. - ret = clEnqueueWriteBuffer(command_queue, blockHeadermobj, CL_TRUE, 0, 80 * sizeof(uint8_t), blockHeader, 0, NULL, NULL); - if (ret != CL_SUCCESS) { - printf("failed to write to blockHeadermobj buffer: %d\n", ret); exit(1); - } - ret = clEnqueueWriteBuffer(command_queue, nonceOutmobj, CL_TRUE, 0, 8 * sizeof(uint8_t), nonceOut, 0, NULL, NULL); - if (ret != CL_SUCCESS) { - printf("failed to write to targmobj buffer: %d\n", ret); exit(1); - } - - // Run the kernel. - ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, &globalid_offset, &global_item_size, &local_item_size, 0, NULL, NULL); - if (ret != CL_SUCCESS) { - printf("failed to start kernel: %d\n", ret); exit(1); - } - - // Copy result to host and see if a block was found. - ret = clEnqueueReadBuffer(command_queue, nonceOutmobj, CL_TRUE, 0, 8 * sizeof(uint8_t), nonceOut, 0, NULL, NULL); - if (ret != CL_SUCCESS) { - printf("failed to read nonce from buffer: %d\n", ret); exit(1); - } - if (nonceOut[0] != 0) { - // Copy nonce to header. - memcpy(blockHeader+32, nonceOut, 8); - if (!submit_header(blockHeader)) { - // Only count block if submit succeeded. - blocks_mined++; - } - return -1; - } - } - - // Get the time elapsed this function. - #ifdef __linux__ - clock_gettime(CLOCK_REALTIME, &end); - double nsElapsed = 1e9 * (double)(end.tv_sec - begin.tv_sec) + (double)(end.tv_nsec - begin.tv_nsec); - double run_time_seconds = nsElapsed * 1e-9; - #else - double run_time_seconds = (double)(clock() - startTime) / CLOCKS_PER_SEC; - #endif - - // Calculate the hash rate of thie iteration. - double hash_rate = cycles_per_iter * global_item_size / (run_time_seconds*1000000); - return hash_rate; -} - -// selectOCLDevice manages opencl device selection as requested by the command -// line arguments. -void selectOCLDevice(cl_platform_id *OCLPlatform, cl_device_id *OCLDevice, cl_uint platformid, cl_uint deviceidx) { - cl_uint platformCount, deviceCount; - cl_platform_id *platformids; - cl_device_id *deviceids; - cl_int ret; - - ret = clGetPlatformIDs(0, NULL, &platformCount); - if(ret != CL_SUCCESS) { - printf("Failed to get number of OpenCL platforms with error code %d (clGetPlatformIDs).\n", ret); - exit(1); - } - - // If we don't exit here, the default platform ID chosen MUST be valid; it's zero. - // I return 0, because this isn't an error - there is simply nothing to do. - if(!platformCount) { - printf("OpenCL is reporting no platforms available on the system. Nothing to do.\n"); - exit(0); - } - - // Since the number of platforms returned is the number of indexes plus one, - // the default platform ID (zero), must exist. User may still specify something - // invalid, however, so check it. - if(platformCount <= platformid) { - printf("Platform selected (%u) is the same as, or higher than, the number ", platformid); - printf("of platforms reported to exist by OpenCL on this system (%u). ", platformCount); - printf("Remember that the first platform has index 0!\n"); - exit(1); - } - - platformids = (cl_platform_id *)malloc(sizeof(cl_platform_id) * platformCount); - - ret = clGetPlatformIDs(platformCount, platformids, NULL); - if(ret != CL_SUCCESS) { - printf("Failed to retrieve OpenCL platform IDs with error code %d (clGetPlatformIDs).\n", ret); - exit(1); - } - - // Now fetch device ID list for this platform similarly to the fetch for the platform IDs. - // platformid has been verified to be within bounds. - ret = clGetDeviceIDs(platformids[platformid], CL_DEVICE_TYPE_GPU, 0, NULL, &deviceCount); - if(ret != CL_SUCCESS) { - printf("Failed to get number of OpenCL devices with error code %d (clGetDeviceIDs).\n", ret); - free(platformids); - exit(1); - } - - // If we have no devices, indicate this to the user. - if(!deviceCount) { - printf("OpenCL is reporting no GPU devices available for chosen platform. Nothing to do.\n"); - free(platformids); - exit(0); - } - - // Check that the device we've been asked to get does, in fact, exist... - if(deviceCount <= deviceidx) { - printf("Device selected (%u) is the same as, or higher than, the number ", deviceidx); - printf("of GPU devices reported to exist by OpenCL on the current platform (%u). ", deviceCount); - printf("Remember that the first device has index 0!\n"); - free(platformids); - exit(1); - } - - deviceids = (cl_device_id *)malloc(sizeof(cl_device_id) * deviceCount); - - ret = clGetDeviceIDs(platformids[platformid], CL_DEVICE_TYPE_GPU, deviceCount, deviceids, NULL); - if(ret != CL_SUCCESS) { - printf("Failed to retrieve OpenCL device IDs for selected platform with error code %d (clGetDeviceIDs).\n", ret); - free(platformids); - free(deviceids); - exit(1); - } - - // Done. Return the platform ID and device ID object desired, free lists, and return. - *OCLPlatform = platformids[platformid]; - *OCLDevice = deviceids[deviceidx]; -} - -// printPlatformsAndDevices prints out a list of opencl platforms and devices -// that were found on the system. -void printPlatformsAndDevices() { - cl_uint platformCount, deviceCount; - cl_platform_id *platformids; - cl_device_id *deviceids; - cl_int ret; - - ret = clGetPlatformIDs(0, NULL, &platformCount); - if (ret != CL_SUCCESS || !platformCount) { - printf("Could not find any opencl platforms on your computer.\n"); - return; - } - printf("Found %u platform(s) on your computer.\n", platformCount); - - platformids = (cl_platform_id *)malloc(sizeof(cl_platform_id) * platformCount); - - ret = clGetPlatformIDs(platformCount, platformids, NULL); - if (ret != CL_SUCCESS) { - printf("Error while fetching platform ids.\n"); - free(platformids); - return; - } - - int i,j; // Iterate through each platform and print its devices - for (i = 0; i < platformCount; i++) { - char str[80]; - // Print platform info. - ret = clGetPlatformInfo(platformids[i], CL_PLATFORM_NAME, 80, str, NULL); - if (ret != CL_SUCCESS) { - printf("\tError while fetching platform info.\n"); - continue; - } - printf("Devices on platform %d, \"%s\":\n", i, str); - ret = clGetDeviceIDs(platformids[i], CL_DEVICE_TYPE_GPU, 0, NULL, &deviceCount); - if (ret != CL_SUCCESS) { - printf("\tError while fetching device ids.\n"); - continue; - } - if (!deviceCount) { - printf("\tNo devices found for this platform.\n"); - continue; - } - deviceids = (cl_device_id *)malloc(sizeof(cl_device_id) * deviceCount); - - ret = clGetDeviceIDs(platformids[i], CL_DEVICE_TYPE_GPU, deviceCount, deviceids, NULL); - if (ret != CL_SUCCESS) { - printf("\tError while getting device ids.\n"); - free(deviceids); - continue; - } - - for (j = 0; j < deviceCount; j++) { - // Print platform info. - ret = clGetDeviceInfo(deviceids[j], CL_DEVICE_NAME, 80, str, NULL); - if (ret != CL_SUCCESS) { - printf("\tError while getting device info.\n"); - free(deviceids); - continue; - } - printf("\tDevice %d: %s\n", j, str); - } - free(deviceids); - } - free(platformids); -} - -// main reads the command line arguments and then starts the miner. The program -// will exit if there are any errors. -int main(int argc, char *argv[]) { - cl_platform_id platform_id = NULL; - cl_device_id device_id = NULL; - cl_context context = NULL; - cl_program program = NULL; - cl_uint platformid = 0, deviceidx = 0; - int i; - unsigned cycles_per_iter; - char hostname[128] = "localhost"; - char port_number[7] = ":9980"; - double hash_rate; - - // Parse args. - cycles_per_iter = DEFAULT_CPI; - for (i = 1; i < argc; i++) { - char c = argv[i][1]; // If argv is "-c" then arv[i][1] is 'c' - if (c == '-') { - // If they did --flag, make c the next char. - c = argv[i][2]; - } - switch (c) { - case 'h': - printf("\nUsage:\n\n"); - printf("\t C - cycles per iter: Number of kernel executions between Sia API calls and hash rate updates\n"); - printf("\t\tA low C will cause instability. As a rule of thumb, the hashrate should only be updating a few times per second.\n"); - printf("\t\tDefault is %u.\n", DEFAULT_CPI); - printf("\n"); - printf("\t I - intensity: This is the amount of work sent to the GPU in one batch.\n"); - printf("\t\tInterpretation is 2^intensity; the default is 16. Lower if GPU crashes or\n"); - printf("\t\tif more desktop interactivity is desired. Highest hashrate is typically at 22-25.\n"); - printf("\n"); - printf("\t H - host: which host name to use when talking to the siad api. (default: %s)\n", hostname); - printf("\n"); - printf("\t P - port: which port to use when talking to the siad api. (e.g. -p :9980)\n"); - printf("\n"); - printf("\t p - OpenCL platform ID: Just what it says on the tin. If you're finding no GPUs,\n"); - printf("\t\tyet you're sure they exist, try a value other than 0, like 1, or 2. Default is 0.\n"); - printf("\n"); - printf("\t d - OpenCL device ID: Self-explanatory; it's the GPU index. Note that different\n"); - printf("\t\tOpenCL platforms will likely have different devices available. Default is 0.\n"); - printf("\n"); - printPlatformsAndDevices(); - printf("\n"); - exit(0); - break; - case 'I': - if (++i >= argc) { - printf("Please pass in a number following your flag (e.g. -I 22)\n"); - exit(1); - } - // atoi returns 0 on error. - intensity = atoi(argv[i]); - if (intensity == 0 && argv[i][0] != '0') { // Check if atoi returned 0 because of an error - printf("Invalid number passed to \'-I\'\n"); - exit(1); - } - - if(intensity < MIN_INTENSITY || intensity > MAX_INTENSITY) { - printf("intensity must be between %u and %u. %u is invalid\n", MIN_INTENSITY, MAX_INTENSITY, intensity); - printf("Note that the default intensity is %d\n", DEFAULT_INTENSITY); - exit(1); - } - printf("Intensity set to %u\n", intensity); - break; - case 'p': - if (++i >= argc) { - printf("Please pass in a number following your flag (e.g. -p 1)\n"); - exit(1); - } - platformid = atoi(argv[i]); - if (platformid == 0 && argv[i][0] != '0') { - printf("Invalid number passed to \'-p\'\n"); - exit(1); - } - break; - case 'd': - if (++i >= argc) { - printf("Please pass in a number following your flag (e.g. -d 1)\n"); - exit(1); - } - deviceidx = atoi(argv[i]); - if (deviceidx == 0 && argv[i][0] != '0') { - printf("Invalid number passed to \'-d\'\n"); - exit(1); - } - break; - case 'C': - if (++i >= argc) { - printf("Please pass in a number following your flag (e.g. -C 10)\n"); - exit(1); - } - cycles_per_iter = atoi(argv[i]); - if (cycles_per_iter == 0 && argv[i][0] != '0') { - printf("Invalid number passed to \'-C\'\n"); - exit(1); - } - - if(cycles_per_iter < MIN_CPI || cycles_per_iter > MAX_CPI) { - printf("cycles per iter must be between %u and %u. %u is invalid\n", MIN_CPI, MAX_CPI, cycles_per_iter); - printf("Note that the default cycles per iter is %d\n", DEFAULT_CPI); - exit(1); - } - printf("Cycles per iteration set to %u\n", cycles_per_iter); - break; - case 'H': - if (++i >= argc) { - printf("Please pass in a host name following your flag (e.g. -H localhost)\n"); - exit(1); - } - strcpy(hostname, argv[i]); - printf("Host name set to %s\n", hostname); - break; - case 'P': - if (++i >= argc) { - printf("Please pass in a port number following your flag (e.g. -P :9980)\n"); - exit(1); - } - if (strlen(argv[i]) < 6) { - strcpy(port_number, argv[i]); - } else { - printf("Invalid port passed in as flag\n"); - exit(1); - } - printf("Port set to %s\n", port_number); - break; - default: - printf("Please use a valid flag. Use \"--help\" for options\n"); - exit(1); - break; - } - } - - // Set siad URL. - set_host(hostname, port_number); - - // Load kernel source file. - printf("Initializing...\n"); - fflush(stdout); - FILE *fp; - const char fileName[] = "./sia-gpu-miner.cl"; - size_t source_size; - char *source_str; - fp = fopen(fileName, "r"); - if (!fp) { - fprintf(stderr, "Failed to load kernel.\n"); - exit(1); - } - source_str = (char *)malloc(MAX_SOURCE_SIZE); - source_size = fread(source_str, 1, MAX_SOURCE_SIZE, fp); - fclose(fp); - - selectOCLDevice(&platform_id, &device_id, platformid, deviceidx); - - // Make sure the device can handle our local item size. - size_t max_group_size = 0; - ret = clGetDeviceInfo(device_id, CL_DEVICE_MAX_WORK_GROUP_SIZE, sizeof(size_t), &max_group_size, NULL); - if (ret != CL_SUCCESS) { printf("failed to get Device IDs: %d\n", ret); exit(1); } - if (local_item_size > max_group_size) { - printf("Selected device cannot handle work groups larger than %zu.\n", local_item_size); - printf("Using work groups of size %zu instead.\n", max_group_size); - local_item_size = max_group_size; - } - - // Create OpenCL Context. - context = clCreateContext(NULL, 1, &device_id, NULL, NULL, &ret); - - // Create command queue. - command_queue = clCreateCommandQueue(context, device_id, 0, &ret); - - // Create Buffer Objects. - blockHeadermobj = clCreateBuffer(context, CL_MEM_READ_ONLY, 80 * sizeof(uint8_t), NULL, &ret); - if (ret != CL_SUCCESS) { printf("failed to create blockHeadermobj buffer: %d\n", ret); exit(1); } - nonceOutmobj = clCreateBuffer(context, CL_MEM_READ_WRITE, 8 * sizeof(uint8_t), NULL, &ret); - if (ret != CL_SUCCESS) { printf("failed to create nonceOutmobj buffer: %d\n", ret); exit(1); } - - // Create kernel program from source file. - program = clCreateProgramWithSource(context, 1, (const char **)&source_str, (const size_t *)&source_size, &ret); - if (ret != CL_SUCCESS) { printf("failed to crate program with source: %d\n", ret); exit(1); } - ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL); - if (ret != CL_SUCCESS) { - // Print information about why the build failed. This code is from - // StackOverflow. - size_t len; - char buffer[204800]; - cl_build_status bldstatus; - printf("\nError %d: Failed to build program executable [ ]\n", ret); - ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_STATUS, sizeof(bldstatus), (void *)&bldstatus, &len); - if (ret != CL_SUCCESS) { - printf("Build Status error %d\n", ret); - exit(1); - } - if (bldstatus == CL_BUILD_SUCCESS) printf("Build Status: CL_BUILD_SUCCESS\n"); - if (bldstatus == CL_BUILD_NONE) printf("Build Status: CL_BUILD_NONE\n"); - if (bldstatus == CL_BUILD_ERROR) printf("Build Status: CL_BUILD_ERROR\n"); - if (bldstatus == CL_BUILD_IN_PROGRESS) printf("Build Status: CL_BUILD_IN_PROGRESS\n"); - ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_OPTIONS, sizeof(buffer), buffer, &len); - if (ret != CL_SUCCESS) { - printf("Build Options error %d\n", ret); - exit(1); - } - printf("Build Options: %s\n", buffer); - ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len); - if (ret != CL_SUCCESS) { - printf("Build Log error %d\n", ret); - exit(1); - } - printf("Build Log:\n%s\n", buffer); - exit(1); - } - - // Create data parallel OpenCL kernel. - kernel = clCreateKernel(program, "nonceGrind", &ret); - - // Set OpenCL kernel arguments. - void *args[] = { &blockHeadermobj, &nonceOutmobj }; - for (i = 0; i < 2; i++) { - ret = clSetKernelArg(kernel, i, sizeof(cl_mem), args[i]); - if (ret != CL_SUCCESS) { - printf("failed to set kernel arg %d (error code %d)\n", i, ret); - exit(1); - } - } - printf("\n"); - - // Initialize network connection variables. - init_network(); - - // Grind nonces until SIGINT. - signal(SIGINT, quitSignal); - while (!quit) { - // Repeat until no block is found. - do { - hash_rate = grindNonces(cycles_per_iter); - } while (hash_rate == -1 && !quit); - - if (!quit) { - printf("\rMining at %.3f MH/s\t%u blocks mined", hash_rate, blocks_mined); - fflush(stdout); - } - } - - // Finalization. - ret = clFlush(command_queue); - ret = clFinish(command_queue); - ret = clReleaseKernel(kernel); - ret = clReleaseProgram(program); - ret = clReleaseMemObject(blockHeadermobj); - ret = clReleaseMemObject(nonceOutmobj); - ret = clReleaseCommandQueue(command_queue); - ret = clReleaseContext(context); - - free_network(); - free(source_str); - return 0; -} diff --git a/sia-gpu-miner.cl b/sia-gpu-miner.cl deleted file mode 100644 index d38b96b..0000000 --- a/sia-gpu-miner.cl +++ /dev/null @@ -1,70 +0,0 @@ -static inline ulong rotr64( __const ulong w, __const unsigned c ) { return ( w >> c ) | ( w << ( 64 - c ) ); } - -__constant static const uchar blake2b_sigma[12][16] = { - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , - { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , - { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , - { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , - { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , - { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , - { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , - { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , - { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 } , - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , - { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } }; - -// Target is passed in via headerIn[32 - 29] -__kernel void nonceGrind(__global ulong *headerIn, __global ulong *nonceOut) { - ulong target = headerIn[4]; - ulong m[16] = { headerIn[0], headerIn[1], - headerIn[2], headerIn[3], - (ulong)get_global_id(0), headerIn[5], - headerIn[6], headerIn[7], - headerIn[8], headerIn[9], 0, 0, 0, 0, 0, 0 }; - - ulong v[16] = { 0x6a09e667f2bdc928, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, - 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179, - 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, - 0x510e527fade68281, 0x9b05688c2b3e6c1f, 0xe07c265404be4294, 0x5be0cd19137e2179 }; - -#define G(r,i,a,b,c,d) \ - a = a + b + m[blake2b_sigma[r][2*i]]; \ - d = rotr64(d ^ a, 32); \ - c = c + d; \ - b = rotr64(b ^ c, 24); \ - a = a + b + m[blake2b_sigma[r][2*i+1]]; \ - d = rotr64(d ^ a, 16); \ - c = c + d; \ - b = rotr64(b ^ c, 63); - -#define ROUND(r) \ - G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ - G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ - G(r,2,v[ 2],v[ 6],v[10],v[14]); \ - G(r,3,v[ 3],v[ 7],v[11],v[15]); \ - G(r,4,v[ 0],v[ 5],v[10],v[15]); \ - G(r,5,v[ 1],v[ 6],v[11],v[12]); \ - G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ - G(r,7,v[ 3],v[ 4],v[ 9],v[14]); - - ROUND( 0 ); - ROUND( 1 ); - ROUND( 2 ); - ROUND( 3 ); - ROUND( 4 ); - ROUND( 5 ); - ROUND( 6 ); - ROUND( 7 ); - ROUND( 8 ); - ROUND( 9 ); - ROUND( 10 ); - ROUND( 11 ); -#undef G -#undef ROUND - - if (as_ulong(as_uchar8(0x6a09e667f2bdc928 ^ v[0] ^ v[8]).s76543210) < target) { - *nonceOut = m[4]; - return; - } -} diff --git a/network.c b/src/network.c similarity index 100% rename from network.c rename to src/network.c diff --git a/network.h b/src/network.h similarity index 100% rename from network.h rename to src/network.h From 00e4166d772b06a2492ada85fc9f878897fffb2b Mon Sep 17 00:00:00 2001 From: droghio Date: Thu, 22 Oct 2015 23:16:05 -0400 Subject: [PATCH 05/17] Got hash rate and blocks processed to be parsed from the miner. --- index.html | 2 +- js/buttons.js | 33 ++++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 12f8a5c..aeefb38 100644 --- a/index.html +++ b/index.html @@ -17,7 +17,7 @@
Miner is Idle
GPU Blocks Mined: 0
Hash Rate: 0
- +
Locked
diff --git a/js/buttons.js b/js/buttons.js index d6a4581..a88bc79 100644 --- a/js/buttons.js +++ b/js/buttons.js @@ -27,34 +27,51 @@ function minerUpdateStatus(){ //Update status text. elByID("minerstatus").innerHTML = (minerstatus == "idle" ? "Miner is Idle" : "Miner is Mining") - + elByID("toggleminer").innerHTML = + (minerstatus == "idle" ? "Start GPU Miner!" : "Stop GPU Miner!") + elByID("gpublocks").innerHTML = "GPU Blocks Mined: " + blocksmined elByID("hashrate").innerHTML = "Hash Rate: " + hashrate } + + elByID("toggleminer").onclick = function (){ if (minerstatus == "idle"){ //Launch the miner! miner = Process( - path.resolve(basedir, "../assets/sia-gpu-miner"),{ - stdio: [ "ignore", "pipe", "pipe" ], - cwd: path.resolve(basedir, "../assets") + path.resolve(basedir, "../assets/sia-gpu-miner"),{ + stdio: [ "ignore", "pipe", "pipe" ], + cwd: path.resolve(basedir, "../assets") }) + minerstatus = "active" + miner.stdout.on('data', function (data) { console.log('stdout: ' + data); minerMessage(data) + values = String(data).replace("\t", " ").split(" ") + + //If we got an update form the miner. + //You might be asking what is with all the trims. + //My answer would be what is with all the nulls. + if (values[0].trim() == "Mining" && values.length == 7){ + hashrate = values[2].trim() + blocksmined = values[4].trim() + minerUpdateStatus() + } }); miner.stderr.on('data', function (data) { console.log('stderr: ' + data); minerMessage(data) + //minerUpateStatus() }); - miner.on('close', function (code) { + miner.on('exit', function (code) { console.log("Miner closed."); minerstatus = idle miner = undefined @@ -62,4 +79,10 @@ elByID("toggleminer").onclick = function (){ minerUpdateStatus() }); } + + else { + minerMessage("Sent kill message to miner.") + miner.kill() + } + } From e5505b08ff8771ccf58d2e491286bb1a13707a5d Mon Sep 17 00:00:00 2001 From: droghio Date: Thu, 22 Oct 2015 23:35:05 -0400 Subject: [PATCH 06/17] Added notifications to be fancy. --- index.html | 3 ++- js/buttons.js | 6 ++++-- js/gpu-miner.js | 18 +++++++++--------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/index.html b/index.html index aeefb38..f4f3f13 100644 --- a/index.html +++ b/index.html @@ -17,7 +17,8 @@
Miner is Idle
GPU Blocks Mined: 0
Hash Rate: 0
-
Locked
+
Balance Unknown
+
Status Unknown
diff --git a/js/buttons.js b/js/buttons.js index a88bc79..834cc53 100644 --- a/js/buttons.js +++ b/js/buttons.js @@ -45,8 +45,8 @@ elByID("toggleminer").onclick = function (){ stdio: [ "ignore", "pipe", "pipe" ], cwd: path.resolve(basedir, "../assets") }) - minerstatus = "active" + IPC.sendToHost('notify', "The GPU miner has started!", "start"); miner.stdout.on('data', function (data) { @@ -72,9 +72,11 @@ elByID("toggleminer").onclick = function (){ }); miner.on('exit', function (code) { + IPC.sendToHost('notify', "The GPU miner has stopped.", "stop"); console.log("Miner closed."); - minerstatus = idle + minerstatus = "idle" miner = undefined + hashrate = 0 minerMessage("Miner stopped.") minerUpdateStatus() }); diff --git a/js/gpu-miner.js b/js/gpu-miner.js index f3f81e8..d1ceaec 100644 --- a/js/gpu-miner.js +++ b/js/gpu-miner.js @@ -12,7 +12,7 @@ var updating; // Make API calls, sending a channel name to listen for responses function update() { IPC.sendToHost('api-call', '/wallet', 'wallet-update'); - IPC.sendToHost('api-call', '/gateway/status', 'peers-update'); + //IPC.sendToHost('api-call', '/gateway/status', 'peers-update'); IPC.sendToHost('api-call', '/consensus', 'height-update'); updating = setTimeout(update, 5000); } @@ -86,12 +86,12 @@ IPC.on('wallet-update', function(err, result) { var bal = formatSiacoin(result.confirmedsiacoinbalance); updateField(err, 'Balance: ', unlocked ? bal : '---', 'balance'); }); -IPC.on('peers-update', function(err, result) { - var value = result !== null ? result.Peers.length : null; - updateField(err, 'Peers: ', value, 'peers'); -}); -IPC.on('height-update', function(err, result) { - var value = result !== null ? result.height : null; - updateField(err, 'Block Height: ', value, 'height'); -}); +//IPC.on('peers-update', function(err, result) { +// var value = result !== null ? result.Peers.length : null; +// updateField(err, 'Peers: ', value, 'peers'); +//}); +//IPC.on('height-update', function(err, result) { +// var value = result !== null ? result.height : null; +// updateField(err, 'Block Height: ', value, 'height'); +//}); From 1c3c09ad418ef5afc16f8262f5dc38e60fbd0155 Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 00:16:20 -0400 Subject: [PATCH 07/17] Added variable intensity. --- index.html | 1 + js/buttons.js | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index f4f3f13..330bfbd 100644 --- a/index.html +++ b/index.html @@ -23,6 +23,7 @@
Start GPU Miner!
+ diff --git a/js/buttons.js b/js/buttons.js index 834cc53..8592a61 100644 --- a/js/buttons.js +++ b/js/buttons.js @@ -39,14 +39,24 @@ function minerUpdateStatus(){ elByID("toggleminer").onclick = function (){ if (minerstatus == "idle"){ + //Launch the miner! + intensity = Number(elByID("intensity").value) + if (intensity < 16 || intensity > 32){ + IPC.sendToHost("notify", "The Intensity Value must be between 16 and 32.", "error") + return + } + miner = Process( - path.resolve(basedir, "../assets/sia-gpu-miner"),{ + path.resolve(basedir, "../assets/sia-gpu-miner"), + [ "-I", intensity],{ stdio: [ "ignore", "pipe", "pipe" ], cwd: path.resolve(basedir, "../assets") }) minerstatus = "active" - IPC.sendToHost('notify', "The GPU miner has started!", "start"); + IPC.sendToHost('notify', + "The GPU miner has started with intensity " + intensity + "!", + "start"); miner.stdout.on('data', function (data) { @@ -86,5 +96,11 @@ elByID("toggleminer").onclick = function (){ minerMessage("Sent kill message to miner.") miner.kill() } - } + + +process.on("beforeexit", function (){ + if (miner){ + miner.kill() + } +}) From c832ab8410dc7066e9694bde8e86fa6690ac7e77 Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 00:27:51 -0400 Subject: [PATCH 08/17] Added loading messages to the interface. --- index.html | 4 ++-- js/buttons.js | 43 ++++++++++++++++++++++++++++++++----------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/index.html b/index.html index 330bfbd..a98e0b6 100644 --- a/index.html +++ b/index.html @@ -15,8 +15,8 @@
Sia GPU Miner
Miner is Idle
-
GPU Blocks Mined: 0
-
Hash Rate: 0
+
Blocks Mined: 0
+
Hash Rate: 0 MHz
Balance Unknown
Status Unknown
diff --git a/js/buttons.js b/js/buttons.js index 8592a61..9de1857 100644 --- a/js/buttons.js +++ b/js/buttons.js @@ -7,6 +7,8 @@ // John Drogo // +//What happens on 400/500 errors reported by the miner? + const Process = require("child_process").spawn const path = require("path") @@ -20,25 +22,42 @@ var hashrate = 0 var miner function minerMessage(text){ - elByID("mineroutput").innerHTML = text + elByID("mineroutput").innerHTML + //elByID("mineroutput").innerHTML = text + elByID("mineroutput").innerHTML } + function minerUpdateStatus(){ //Update status text. - elByID("minerstatus").innerHTML = - (minerstatus == "idle" ? "Miner is Idle" : "Miner is Mining") - - elByID("toggleminer").innerHTML = - (minerstatus == "idle" ? "Start GPU Miner!" : "Stop GPU Miner!") - - elByID("gpublocks").innerHTML = "GPU Blocks Mined: " + blocksmined - elByID("hashrate").innerHTML = "Hash Rate: " + hashrate + switch (minerstatus){ + case "idle": + elByID("minerstatus").innerHTML = "Miner is Idle" + elByID("gpublocks").innerHTML = "Blocks Mined: " + blocksmined + elByID("hashrate").innerHTML = "Hash Rate: " + hashrate + " MHz" + break; + + case "loading": + elByID("minerstatus").innerHTML = "Miner is Loading" + elByID("gpublocks").innerHTML = "Loading..." + elByID("hashrate").innerHTML = "Loading..." + break + + default: + elByID("minerstatus").innerHTML = "Miner is Mining" + elByID("gpublocks").innerHTML = "Blocks Mined: " + blocksmined + elByID("hashrate").innerHTML = "Hash Rate: " + hashrate + break + } } elByID("toggleminer").onclick = function (){ if (minerstatus == "idle"){ + if (elByID("lock").innerHTML != "Unlocked"){ + IPC.sendToHost("notify", "Please unlock your wallet before starting the miner.", "error") + return + } + //Launch the miner! intensity = Number(elByID("intensity").value) @@ -53,7 +72,8 @@ elByID("toggleminer").onclick = function (){ stdio: [ "ignore", "pipe", "pipe" ], cwd: path.resolve(basedir, "../assets") }) - minerstatus = "active" + minerstatus = "loading" + minerUpdateStatus() IPC.sendToHost('notify', "The GPU miner has started with intensity " + intensity + "!", "start"); @@ -62,7 +82,8 @@ elByID("toggleminer").onclick = function (){ miner.stdout.on('data', function (data) { console.log('stdout: ' + data); minerMessage(data) - + + minerstatus = "active" values = String(data).replace("\t", " ").split(" ") //If we got an update form the miner. From 02a62492ab339de504e98e802a13e01bbccf2825 Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 00:38:47 -0400 Subject: [PATCH 09/17] Things look nice now. --- css/overview.css | 7 +++++++ index.html | 11 ++++++++--- js/buttons.js | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/css/overview.css b/css/overview.css index 609622d..fbb0dad 100644 --- a/css/overview.css +++ b/css/overview.css @@ -12,6 +12,7 @@ .frame { color: #f5f5f5; } + .welcome { -webkit-animation: fadein 3s; position: relative; @@ -19,6 +20,8 @@ transform: translateY(-35%); text-align: center; color: #c5c5c5; + font-size: 48px; + vertical-align: middle; } .welcome .large { font-size: 72px; @@ -27,3 +30,7 @@ margin-top: 20px; font-size: 32px; } + +#intensity{ + text-align: left; +} diff --git a/index.html b/index.html index a98e0b6..6f92283 100644 --- a/index.html +++ b/index.html @@ -22,9 +22,14 @@ -
Start GPU Miner!
- - +
+ Start GPU Miner! +

+ + +

+ +
diff --git a/js/buttons.js b/js/buttons.js index 9de1857..f58e447 100644 --- a/js/buttons.js +++ b/js/buttons.js @@ -98,6 +98,7 @@ elByID("toggleminer").onclick = function (){ miner.stderr.on('data', function (data) { console.log('stderr: ' + data); + IPC.sendToHost("notify", "GPU Mining Error: " + data, "error") minerMessage(data) //minerUpateStatus() }); From 4ef1b9f562298853bf821c1b9700a06df91ece13 Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 01:19:07 -0400 Subject: [PATCH 10/17] This is purty and works on Mac. --- css/overview.css | 28 +++++++++++++++++++++++++--- index.html | 1 + js/buttons.js | 7 ++++++- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/css/overview.css b/css/overview.css index fbb0dad..c38c73c 100644 --- a/css/overview.css +++ b/css/overview.css @@ -16,8 +16,8 @@ .welcome { -webkit-animation: fadein 3s; position: relative; - top: 35%; - transform: translateY(-35%); + top: 25%; + transform: translateY(-25%); text-align: center; color: #c5c5c5; font-size: 48px; @@ -27,10 +27,32 @@ font-size: 72px; } .welcome .small { - margin-top: 20px; + margin-top: 30px; font-size: 32px; } + +.button{ + cursor: pointer; + padding: 10px 20px; + transition: all 1s; +} + +.button:not(:hover){ + background-color: #f5f5f5; + border-radius: 35px; +} + #intensity{ text-align: left; } + +#hashrate, #balance{ + display: none; +} + + +#hashratehuge{ + font-size: 72px; + margin-bottom: 72px; +} diff --git a/index.html b/index.html index 6f92283..c7b56c9 100644 --- a/index.html +++ b/index.html @@ -23,6 +23,7 @@
+
Miner is Idle
Start GPU Miner!

diff --git a/js/buttons.js b/js/buttons.js index f58e447..e49e289 100644 --- a/js/buttons.js +++ b/js/buttons.js @@ -31,20 +31,25 @@ function minerUpdateStatus(){ switch (minerstatus){ case "idle": elByID("minerstatus").innerHTML = "Miner is Idle" + elByID("toggleminer").innerHTML = "Start GPU Miner!" elByID("gpublocks").innerHTML = "Blocks Mined: " + blocksmined elByID("hashrate").innerHTML = "Hash Rate: " + hashrate + " MHz" + elByID("hashratehuge").innerHTML = "Miner is Idle" break; case "loading": elByID("minerstatus").innerHTML = "Miner is Loading" + elByID("toggleminer").innerHTML = "Miner is Loading" elByID("gpublocks").innerHTML = "Loading..." elByID("hashrate").innerHTML = "Loading..." break default: elByID("minerstatus").innerHTML = "Miner is Mining" + elByID("toggleminer").innerHTML = "Stop GPU Miner" elByID("gpublocks").innerHTML = "Blocks Mined: " + blocksmined - elByID("hashrate").innerHTML = "Hash Rate: " + hashrate + elByID("hashrate").innerHTML = "Hash Rate: " + hashrate + " MHz" + elByID("hashratehuge").innerHTML = hashrate + " MHz" break } } From 0ebaeec1ba8c7ee848889861df603738196c2cfe Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 01:36:23 -0400 Subject: [PATCH 11/17] Added fancy logo and updated readme a little bit. --- assets/LICENSE.txt | 21 +++++++++++++++ assets/README.txt | 63 +++++++++++++++++++++++++++++++++++++++++++++ assets/button.png | Bin 258 -> 1053 bytes assets/libcurl.dll | Bin 0 -> 382464 bytes 4 files changed, 84 insertions(+) create mode 100755 assets/LICENSE.txt create mode 100755 assets/README.txt create mode 100755 assets/libcurl.dll diff --git a/assets/LICENSE.txt b/assets/LICENSE.txt new file mode 100755 index 0000000..cf17dd6 --- /dev/null +++ b/assets/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Nebulous + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/assets/README.txt b/assets/README.txt new file mode 100755 index 0000000..8904c52 --- /dev/null +++ b/assets/README.txt @@ -0,0 +1,63 @@ +README + +Miner v1.0.7 +October 23, 2015 +=============== + +The source code for the miner (and Sia as a whole) comes from Nebulous Labs, +check out their website for more info: https://siacoin.com/ + +The logo comes from Guvnor Co, AU and is licensed under CCC +check out their website for more info: https://thenounproject.com/term/pickaxe/18785/ + +This readme assumes you downloaded the latest release from the following link. It does not cover compiling from source: + https://github.com/droghio/Sia-GPU-Miner/releases + +Anyhow this is the latest Windows build of the Sia-GPU-Miner dubbed version v1.0.5. +Assuming everything unzipped correctly you should have the following five files. + - README (That's me.) + - LICENSE + - sia-gpu-miner.exe + - sia-gpu-miner.cl + - libcurl.dll + +If you are missing any of these files you have a problem, +try redownloading the binary from my github: + https://github.com/droghio/Sia-GPU-Miner/releases + +If you are still missing things (probably libcurl.dll) you might want to make sure your antivirus isn't +messing with your zip file. Norton is notorious for killing dlls without consent. + +If the miner fails to load make sure you have the 2012 MS Redistributable installed: + https://www.microsoft.com/en-us/download/details.aspx?id=30679 + +Other hints and tips: + 1. MAKE SURE YOU CHANGE THE INTENSITY! + I upped the default intensity to 20 but make sure you + change this if your care can take it! I'm talking about + a 200+MH/s mining rate difference for a proper intensity value. + I use an intensity of 27 on my 7970 and get about 770MH/s on a hefty overclock. + + To change this you'll need to launch the miner from a command prompt. + a. Hit the Windows key start typing "cmd". + You should see an app called Command Prompt + + b. After opening the command prompt type "cd " into the black window then + click and drag the folder where the sia-gpu-miner.exe lives into the window. + + You should see something like: + C:\>cd C:\Users\John\Downloads\sia-gpu-miner.exe + + c. Press enter, then type "sia-gpu-miner.exe -I 27" where you replace the "27" with + whatever intensity works best for your card. Too low and you aren't using + your card's full potential, too high and you get diminishing returns. + + 2. If you get an "HTTP error 400" make sure the Sia UI or siad is running AND you have unlocked your wallet. + + 3. I compile the binary against AMD's OpenCL libs and this is a 64 bit binary meaning it won't run + on older machines. Even though I am using AMD's libs I have tested this program on a Nvidia 970 + and got good hash rates (~1MH/s) so you should be fine using either brand of card. + + +If you have any questions concerns etc feel free to reach out to me via email or irc (freenode). In the mean time happy mining! + - droghio \ No newline at end of file diff --git a/assets/button.png b/assets/button.png index 5e214df34fb51fea5f06209010bb1f2949b5f37a..5bd21b4f033171bdb2dd72dffc0d1160de21d701 100644 GIT binary patch delta 1032 zcmV+j1o!)b0-XquB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01CeV01CeW%R}Gm0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$Tnn^@KRCt`_+C8WoRTRMS z-%X-EL<2s3kQfMPA@K!?X+#9W3s{JP+E`d>uRO%gE+B%HU4NPgR*FxAXs`*1iUBbw zr~!$eF(?{>AS7C7l9yvK^I%+OXJ+Nw`FFQ>UO+*_ z3s~0?g@9bbf{SMX0o+WN3{TYnAM zh?LSUe28roX;-ll5hrTbodp3k;Wy$Z?1_j!>(p-jDUedysXu(#>2L>Lt=(YS6P_9q zqNB%FW)VmEo7HVA4XMdr!?eL#qVZ^%2xKOBdq;&!Yz@M&j z8yisn;r!R%sQJJD9oh`PZA^WhE7U#N3IR>Q7y2D6)c?=laGi(Gdv3w8yvM1j2^awX z%_QIpy%%w|_gXL)@P#qlCwqciYg9lD`0Wk;5YOT=b~GZOP4I;=t>M7L1+)=9AJ(c-R-?ngrB@|Lt0OOgcsu&;@u#6wnoTMi4Ln{(Cb7 z&yWIYz^}{_JVOZRB0Mz(bQPW&0=f*(0Dl2pyWo{YUja4Yf1T98nu<~Z^8!zafC2D7 z=ny$Ly?002ovPDHLkU;%=3 CjL?_> delta 230 zcmV)?{2{UJ=_Kt z*Z6pd-x`NKaREV=s!vhJ9EH&Wu7w9#%9wj`04_W?w)Cg#S6}}DC%*U(kR(Y`udKux z7`nu<62nR?Gwg{A2(natiaM;saxYqmNs=V>%0{Sxp-UVaA#8*)!=AW+AWPM!sKZ7m g_o9uEBuP>a9#$*wf*}lbG5`Po07*qoM6N<$f`tcR>Hq)$ diff --git a/assets/libcurl.dll b/assets/libcurl.dll new file mode 100755 index 0000000000000000000000000000000000000000..ba0e2e66040786f09f2947a081d5bab523939805 GIT binary patch literal 382464 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

YiiQ6u{=;I4NDzJa$vZ4rO*PIVuneaML%>Z&4M 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≧?Q;%l-Jf5l7u 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

fB|H$okO*O_#`-VJ?#X30USg2+H6#N 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 literal 0 HcmV?d00001 From ed681f76c276033dba173934896cf96330467d8f Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 02:00:25 -0400 Subject: [PATCH 12/17] It works. --- js/buttons.js | 36 +++++++++++++++++++++++++++++++++++- js/gpu-miner.js | 2 +- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/js/buttons.js b/js/buttons.js index e49e289..90f7560 100644 --- a/js/buttons.js +++ b/js/buttons.js @@ -11,6 +11,7 @@ const Process = require("child_process").spawn const path = require("path") +const os = require("os") basedir = window.location.pathname @@ -20,6 +21,34 @@ var blocksmined = 0 var hashrate = 0 var miner +var minerfile = "" + +var platform = os.platform() +switch (platform){ + case "linux": + minerfile = "sia-gpu-miner-Linux" + break; + + case "darwin": + minerfile = "sia-gpu-miner-Mac" + break + + case "win32": + minerfile = "sia-gpu-miner-Windows.exe" + break; + + default: + IPC.sendToHost("notify", "Invalid OS detected. Please use Linux, Mac, or Windows with this plugin.", "error") + elByID("toggleminer").innerHTML = "Invalid OS" + break; +} + +if (os.arch() != "x64"){ + IPC.sendToHost("notify", "Invalid arch detected. Please use a 64bit processor.", "error") + elByID("toggleminer").innerHTML = "Invalid Arch" + minerfile = "" +} + function minerMessage(text){ //elByID("mineroutput").innerHTML = text + elByID("mineroutput").innerHTML @@ -57,6 +86,11 @@ function minerUpdateStatus(){ elByID("toggleminer").onclick = function (){ + if (!minerfile){ + IPC.sendToHost("notify", "Invalid OS detected. Please use 64 bit Linux, Mac, or Windows with this plugin.", "error") + return + } + if (minerstatus == "idle"){ if (elByID("lock").innerHTML != "Unlocked"){ IPC.sendToHost("notify", "Please unlock your wallet before starting the miner.", "error") @@ -72,7 +106,7 @@ elByID("toggleminer").onclick = function (){ } miner = Process( - path.resolve(basedir, "../assets/sia-gpu-miner"), + path.resolve(basedir, "../assets/"+minerfile), [ "-I", intensity],{ stdio: [ "ignore", "pipe", "pipe" ], cwd: path.resolve(basedir, "../assets") diff --git a/js/gpu-miner.js b/js/gpu-miner.js index d1ceaec..5b46041 100644 --- a/js/gpu-miner.js +++ b/js/gpu-miner.js @@ -42,7 +42,7 @@ function formatSiacoin(hastings) { // Called by the UI upon showing function start() { // DEVTOOL: uncomment to bring up devtools on plugin view - IPC.sendToHost('devtools'); + // IPC.sendToHost('devtools'); // Call the API update(); From 18a21c7ebc599c06f602c36e0cd857cd77bbd908 Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 02:27:25 -0400 Subject: [PATCH 13/17] It now works for Windows. --- js/buttons.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/buttons.js b/js/buttons.js index 90f7560..b5cf969 100644 --- a/js/buttons.js +++ b/js/buttons.js @@ -35,6 +35,8 @@ switch (platform){ case "win32": minerfile = "sia-gpu-miner-Windows.exe" + //Remove nonsense leading slash for Windows. + basedir = basedir.slice(1) break; default: From 24fcaac6ee70aca7f0072c48ac6049dc069460ea Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 02:38:36 -0400 Subject: [PATCH 14/17] Updated readmes. --- README.md | 39 +++++++-------------------------------- Release_README.txt | 34 ++++++++++++++++------------------ assets/README.txt | 4 ++-- 3 files changed, 25 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 329af7d..591eb36 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,22 @@ # Sia-GPU-Miner -A GPU miner designed for mining siacoins. This miner runs in a command prompt -and prints your hashrate along side the number of blocks you've mined. Most -cards will see greatly increased hashrates by increasing the value of 'I' -(default is 20, optimal is typically 20-28). +A GPU miner plugin designed for mining siacoins. Supports Windows, Mac, and Linux. Unzip this file into your plugin directory for Sia. +E.g. C:\Users\John\Downloads\Sia-UI-v0.4.6-beta-win64\Sia-UI-v0.4.4-beta-win64\resources\app\plugins ## How to Use -1) Download the latest build from: https://github.com/droghio/Sia-GPU-Miner/releases +1) Open Sia-UI -2) Make sure you have a recent version of Sia installed and running. Don't forget to unlock your wallet. +2) Unlock Wallet -3) Run the miner by double clicking the `gpu-miner.exe`. It will mine blocks until killed with Ctrl-C. +3) Click the mining tab and start mining. ## Configuration -You can tweak the miner settings with five command-line arguments: `-I`, `-C`, `-p`, `-d`, and `-P`. -* -I controls the intensity. On each GPU call, the GPU will do 2^I hashes. The +* You can set the intensity with the provided field. On each GPU call, the GPU will do 2^I hashes. The default value is low to prevent certain GPUs from crashing immediately at startup. Most cards will benefit substantially from increasing the value. The default is 20, but recommended (for most cards) is 20-28. -* -C controls how frequently calls to siad are made. Reducing it substantially - could cause instability to the miner. Increasing it will reduce the frequency - at which the hashrate is updated. If a low 'I' is being used, a high 'C' - should be used. As a rule of thumb, the hashrate should only be updating a - few times per second. The default is 30. -* -p allows you to pick a platform. Default is the first platform (indexing - from 0). -* -d allows you to pick which device to copmute on. Default is the first device - (indexing from 0). -* -P changes the port that the miner makes API calls to. Use this if you - configured Sia to be on a port other than the default. Default is 9980. - -If you wanted to run the program on platform 0, device 1, with an intensity of -24, you would call `sia-gpu-miner -d 1 -I 24` ## Multiple GPUs -Each instance of the miner can only point to a single GPU. To mine on multiple -GPUs at the same time, you will need to run multiple instances of the miner and -point each at a different gpu. Only one instance of 'siad' needs to be running, -all of the miners can point to it. - -It is highly recommended that you greatly increase the value of 'C' when using -multiple miners. As a rule of thumb, the hashrate for each miner should be -updating one time per [numGPUs] seconds. You should not mine with more than 6 -cards at a time (per instance of siad). +Not currently supported. The miner will select the first card by default. ## Notes * Each Sia block takes about a week or so to mine. diff --git a/Release_README.txt b/Release_README.txt index a534bc0..f8bccb1 100644 --- a/Release_README.txt +++ b/Release_README.txt @@ -1,28 +1,28 @@ README -Miner v1.0.3 -October 16, 2015 +Miner v1.0.5-ui +October 23, 2015 =============== The source code for the miner (and Sia as a whole) comes from Nebulous Labs, check out their website for more info: https://siacoin.com/ +The logo comes from Guvnor Co, AU and is licensed under CCC +check out their website for more info: https://thenounproject.com/term/pickaxe/18785/ + This readme assumes you downloaded the latest release from the following link. It does not cover compiling from source: https://github.com/droghio/Sia-GPU-Miner/releases -Anyhow this is the latest Windows build of the Sia-GPU-Miner dubbed version v1.0.3. -Assuming everything unzipped correctly you should have the following five files. - - README (That's me.) - - LICENSE - - sia-gpu-miner.exe - - sia-gpu-miner.cl - - libcurl.dll -If you are missing any of these files you have a problem, -try redownloading the binary from my github: - https://github.com/droghio/Sia-GPU-Miner/releases +Anyhow this is the latest plugin build of the Sia-GPU-Miner dubbed version v1.0.5-ui. + +THIS PLUGIN SUPPORTS x64 WINDOWS, LINUX, and MAC! +Unzip this to your plugin directory, eg + C:\Users\John\Downloads\Sia-UI-v0.4.6-beta-win64\Sia-UI-v0.4.4-beta-win64\resources\app\plugins -If you are still missing things (probably libcurl.dll) you might want to make sure your antivirus isn't + + +If you are still having problems and are missing things (probably libcurl.dll) you might want to make sure your antivirus isn't messing with your zip file. Norton is notorious for killing dlls without consent. If the miner fails to load make sure you have the 2012 MS Redistributable installed: @@ -30,7 +30,7 @@ If the miner fails to load make sure you have the 2012 MS Redistributable instal Other hints and tips: 1. MAKE SURE YOU CHANGE THE INTENSITY! - I upped the default intensity to 20 but make sure you + I upped the default intensity to 16 but make sure you change this if your care can take it! I'm talking about a 200+MH/s mining rate difference for a proper intensity value. I use an intensity of 27 on my 7970 and get about 770MH/s on a hefty overclock. @@ -49,12 +49,10 @@ Other hints and tips: whatever intensity works best for your card. Too low and you aren't using your card's full potential, too high and you get diminishing returns. - 2. If you get an "HTTP error 400" make sure the Sia UI or siad is running AND you have unlocked your wallet. - - 3. I compile the binary against AMD's OpenCL libs and this is a 64 bit binary meaning it won't run + 2. I compile the binary against AMD's OpenCL libs and this is a 64 bit binary meaning it won't run on older machines. Even though I am using AMD's libs I have tested this program on a Nvidia 970 and got good hash rates (~1MH/s) so you should be fine using either brand of card. If you have any questions concerns etc feel free to reach out to me via email or irc (freenode). In the mean time happy mining! - - droghio \ No newline at end of file + - droghio diff --git a/assets/README.txt b/assets/README.txt index 8904c52..3e8be06 100755 --- a/assets/README.txt +++ b/assets/README.txt @@ -1,6 +1,6 @@ README -Miner v1.0.7 +Miner v1.0.5-ui October 23, 2015 =============== @@ -60,4 +60,4 @@ Other hints and tips: If you have any questions concerns etc feel free to reach out to me via email or irc (freenode). In the mean time happy mining! - - droghio \ No newline at end of file + - droghio From 0c14ff3c8e4342bd11956fbad82028dec5862b1b Mon Sep 17 00:00:00 2001 From: droghio Date: Fri, 23 Oct 2015 02:59:45 -0400 Subject: [PATCH 15/17] Added binaries into repo. --- assets/sia-gpu-miner-Linux | Bin 0 -> 28168 bytes assets/sia-gpu-miner-Mac | Bin 0 -> 25156 bytes assets/sia-gpu-miner-Windows.exe | Bin 0 -> 21504 bytes assets/sia-gpu-miner.cl | 70 +++++++++++++++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100755 assets/sia-gpu-miner-Linux create mode 100755 assets/sia-gpu-miner-Mac create mode 100755 assets/sia-gpu-miner-Windows.exe create mode 100644 assets/sia-gpu-miner.cl diff --git a/assets/sia-gpu-miner-Linux b/assets/sia-gpu-miner-Linux new file mode 100755 index 0000000000000000000000000000000000000000..e91b1900295db8f751c6044ec8f145cfe455f691 GIT binary patch literal 28168 zcmeHweRx#WwfD)FhJcwsL8DMTVgeD#kRV_{u`?urGa6v{5^gP>44IQ;WHK|I55DTP zu_5R*#zw2w+xL1e_FBumy|?A{X)RDY22ehH+ACtURC_Dp*BMcXSSeaD?{Dq1_spJQ z4tjgv_j&*E@MQK`zrEJlYp=cc+WVZ@v-wtY%lyKE0!3Vf%Jm9S4%NXR^HWg{v@?=p z4N95fP`<2OqMQe$1b+^eL#cTu(z-%3L!_mguLx-|{=z&zT<8Erw1X050{hIQ!a_=^ zyv*g`w`Lk!V3HzL6qNxaN45?vWF*p7b|cawWDu@SGKyU)`y}&7u5=M2k+!lMkq&Xg zL@Me>YUuASUcb8v9iWJIP{OUsq@q~&8!;c`Q^JN z9Qnqo2@NOvChY8gzx?>~C(4nX_qqWJ$K=WRG7QLvw^`ul!@zv}doB1IP^Oxv+_e_? zEf#j(YoWi_0w+J`v-3?0{_k7hvn=Yn(ZWurg`OW+@PBN`f{!(m;YVPf0XMH{Kd?k zGDREX$kP8I^TP$o=4siuf_Yk(kE=u6c2Pz~_#HIwIaKkc|=D8-tRrE^pAcgya>^ z4eLBh^$veDrbikB-e^>hX0)%2_+$FKcze4Z$$(3Bua9FM*YbrPpB~}z%NI5VLP34G zcTGSC|NKBa+KF_T9y9H8Mmj()&|};pW}Pe89s+8b#_J)~S28t?W-2t_AM~RPW`~6p zqRzr`D85Nw=Wo+_!5O-VYEIS#ys`FBq|3zs?)hBH7V2G#*W9AFQCpZraI04OW1Y)F z@kkrFz|2W|P*zUWMl-j?BLQmU8H%SJl~IWHps6={KtXw$jK(5*BoabHq@fNy=4akZ zBVj#4mP?&=%JsB+{Q(6A#zHI!fXm})m&BtnUnm|^y7aEL@J6M*Ef9+8N|!ef z2(>{DJt(5Iqi^~kX7aE?!G;1*%b34QSE2!353^z;P{J5sgH(veL;mEwzsu_nl1}t+ z-RF&YA-E^X1+#Q>~3Dv*y5?T*I_JU zVB;!ct2v@da7Ul?kMar`ZQhyrw4Nsp`ZHI}ChvJbOkBtiU8tPT`3o=^m+(J?4R#R{ zgK}EmwBql+dmg|t@q9&R@kvp}`u!Ks$}!C8_$B@k^hB|V)3J+*E>^a1`uj}2NVyj@ zT~sEOMf&O5-bpL0LggWze|m8%!)a|Qug69FqZ-a(9Q=dFQNn30D6UF(E4!t-in1%_8%ZvJM3Ad%W@th#xqU|VqK*C2${0~aFyuR8h;a`&Yw@LU|3EwW^ z7fSdJ3BO3f2PGV{Z2CGN;TNY-ML8tlmq_>#2^Y`Olzmjfzbx?^5`L+K4@vlC5`J33 zRS8%4JWu`hatSY$@QD&$A>mg@c%_6_Nw_NE)e>GK;gcl1PQoWkc!Px3NVr47uat02 z!ly{MTf(oB@Kq8%Rl-{(yjH?HCEPCIVF{lm;Tt5JqOQ2QCA?mMNbi*J=@LF5;a5xe zgAzVN!naEJObOR|-YM1kN`5p~RkYs0Scwrurq=UR>0XHmx5G2<1

tefYFp=D;1% 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