openclpow.py.bak
1 """ 2 Module for Proof of Work using OpenCL 3 """ 4 import logging 5 import os 6 from struct import pack 7 8 import paths 9 from bmconfigparser import config 10 from state import shutdown 11 12 try: 13 import numpy 14 import pyopencl as cl 15 libAvailable = True 16 except ImportError: 17 libAvailable = False 18 19 20 logger = logging.getLogger('default') 21 22 ctx = False 23 queue = False 24 program = False 25 gpus = [] 26 enabledGpus = [] 27 vendors = [] 28 hash_dt = None 29 30 31 def initCL(): 32 """Initlialise OpenCL engine""" 33 global ctx, queue, program, hash_dt # pylint: disable=global-statement 34 if libAvailable is False: 35 return 36 del enabledGpus[:] 37 del vendors[:] 38 del gpus[:] 39 ctx = False 40 try: 41 hash_dt = numpy.dtype([('target', numpy.uint64), ('v', numpy.str_, 73)]) 42 try: 43 for platform in cl.get_platforms(): 44 gpus.extend(platform.get_devices(device_type=cl.device_type.GPU)) 45 if config.safeGet("bitmessagesettings", "opencl") == platform.vendor: 46 enabledGpus.extend(platform.get_devices( 47 device_type=cl.device_type.GPU)) 48 if platform.vendor not in vendors: 49 vendors.append(platform.vendor) 50 except: # nosec B110 # noqa:E722 # pylint:disable=bare-except 51 pass 52 if enabledGpus: 53 ctx = cl.Context(devices=enabledGpus) 54 queue = cl.CommandQueue(ctx) 55 f = open(os.path.join(paths.codePath(), "bitmsghash", 'bitmsghash.cl'), 'r') 56 fstr = ''.join(f.readlines()) 57 program = cl.Program(ctx, fstr).build(options="") 58 logger.info("Loaded OpenCL kernel") 59 else: 60 logger.info("No OpenCL GPUs found") 61 del enabledGpus[:] 62 except Exception: 63 logger.error("OpenCL fail: ", exc_info=True) 64 del enabledGpus[:] 65 66 67 def openclAvailable(): 68 """Are there any OpenCL GPUs available?""" 69 return bool(gpus) 70 71 72 def openclEnabled(): 73 """Is OpenCL enabled (and available)?""" 74 return bool(enabledGpus) 75 76 77 def do_opencl_pow(hash_, target): 78 """Perform PoW using OpenCL""" 79 output = numpy.zeros(1, dtype=[('v', numpy.uint64, 1)]) 80 if not enabledGpus: 81 return output[0][0] 82 83 data = numpy.zeros(1, dtype=hash_dt, order='C') 84 data[0]['v'] = ("0000000000000000" + hash_).decode("hex") 85 data[0]['target'] = target 86 87 hash_buf = cl.Buffer(ctx, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=data) 88 dest_buf = cl.Buffer(ctx, cl.mem_flags.WRITE_ONLY, output.nbytes) 89 90 kernel = program.kernel_sha512 91 worksize = kernel.get_work_group_info(cl.kernel_work_group_info.WORK_GROUP_SIZE, enabledGpus[0]) 92 93 kernel.set_arg(0, hash_buf) 94 kernel.set_arg(1, dest_buf) 95 96 progress = 0 97 globamt = worksize * 2000 98 99 while output[0][0] == 0 and shutdown == 0: 100 kernel.set_arg(2, pack("<Q", progress)) 101 cl.enqueue_nd_range_kernel(queue, kernel, (globamt,), (worksize,)) 102 try: 103 cl.enqueue_read_buffer(queue, dest_buf, output) 104 except AttributeError: 105 cl.enqueue_copy(queue, output, dest_buf) 106 queue.finish() 107 progress += globamt 108 if shutdown != 0: 109 raise Exception("Interrupted") 110 # logger.debug("Took %d tries.", progress) 111 return output[0][0]