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.
137 lines
3.3 KiB
137 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
|
|
|