/ src / openclpow.py.bak
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]