GOSTCoin CUDA miner project, compatible with most nvidia cards, containing only gostd algo
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
3.3 KiB

#pragma once
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdexcept>
#include <vector>
#include <cuda.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <device_functions_decls.h>
#ifdef WIN32
#define _SNPRINTF _snprintf
#else
#define _SNPRINTF snprintf
#endif
#ifndef nullptr
#define nullptr NULL
#endif
#ifdef WIN32
#define rt_error std::runtime_error
#else
class rt_error : public std::runtime_error
{
public:
explicit rt_error(const std::string& str) : std::runtime_error(str) {}
};
#endif
#define checkCudaErrors(call) \
do { \
cudaError_t err = call; \
if (cudaSuccess != err) { \
char errorBuff[512]; \
_SNPRINTF(errorBuff, sizeof(errorBuff) - 1, \
"CUDA error '%s' in func '%s' line %d", \
cudaGetErrorString(err), __FUNCTION__, __LINE__); \
throw rt_error(errorBuff); \
} \
} while (0)
#define checkCudaDriverErrors(call) \
do { \
CUresult err = call; \
if (CUDA_SUCCESS != err) { \
char errorBuff[512]; \
_SNPRINTF(errorBuff, sizeof(errorBuff) - 1, \
"CUDA error DRIVER: '%d' in func '%s' line %d", \
err, __FUNCTION__, __LINE__); \
throw rt_error(errorBuff); \
} \
} while (0)
typedef uint64_t u64;
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
typedef unsigned char uchar;
struct packer_default;
struct packer_cantor;
#define MAXREALSOLS 9
struct scontainerreal {
u32 sols[MAXREALSOLS][512];
u32 nsols;
};
#if 0
#include <functional>
#define fn_solution std::function<void(int thr_id, const std::vector<uint32_t>&, size_t, const unsigned char*)>
#define fn_hashdone std::function<void(int thr_id)>
#define fn_cancel std::function<bool(int thr_id)>
#else
typedef void (*fn_solution)(int thr_id, const std::vector<uint32_t>&, size_t, const unsigned char*);
typedef void (*fn_hashdone)(int thr_id);
typedef bool (*fn_cancel)(int thr_id);
#endif
template <u32 RB, u32 SM> struct equi;
// ---------------------------------------------------------------------------------------------------
struct eq_cuda_context_interface
{
//virtual ~eq_cuda_context_interface();
virtual void solve(const char *tequihash_header,
unsigned int tequihash_header_len,
const char* nonce,
unsigned int nonce_len,
fn_cancel cancelf,
fn_solution solutionf,
fn_hashdone hashdonef);
public:
int thread_id;
int device_id;
int throughput;
int totalblocks;
int threadsperblock;
int threadsperblock_digits;
size_t equi_mem_sz;
};
// ---------------------------------------------------------------------------------------------------
template <u32 RB, u32 SM, u32 SSM, u32 THREADS, typename PACKER>
class eq_cuda_context : public eq_cuda_context_interface
{
equi<RB, SM>* device_eq;
scontainerreal* solutions;
CUcontext pctx;
void solve(const char *tequihash_header,
unsigned int tequihash_header_len,
const char* nonce,
unsigned int nonce_len,
fn_cancel cancelf,
fn_solution solutionf,
fn_hashdone hashdonef);
public:
eq_cuda_context(int thr_id, int dev_id);
void freemem();
~eq_cuda_context();
};
// RB, SM, SSM, TPB, PACKER... but any change only here will fail..
#define CONFIG_MODE_1 9, 1248, 12, 640, packer_cantor
//#define CONFIG_MODE_2 8, 640, 12, 512, packer_default