openclpow quality fixes
This commit is contained in:
parent
1181db66e0
commit
cacac00e21
|
@ -1,8 +1,9 @@
|
||||||
#!/usr/bin/env python2.7
|
#!/usr/bin/env python2.7
|
||||||
|
"""
|
||||||
|
Module for Proof of Work using OpenCL
|
||||||
|
"""
|
||||||
from struct import pack, unpack
|
from struct import pack, unpack
|
||||||
import time
|
|
||||||
import hashlib
|
import hashlib
|
||||||
import random
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from bmconfigparser import BMConfigParser
|
from bmconfigparser import BMConfigParser
|
||||||
|
@ -27,6 +28,8 @@ except ImportError:
|
||||||
|
|
||||||
|
|
||||||
def initCL():
|
def initCL():
|
||||||
|
"""Initlialise OpenCL engine"""
|
||||||
|
# pylint: disable=global-statement
|
||||||
global ctx, queue, program, hash_dt, libAvailable
|
global ctx, queue, program, hash_dt, libAvailable
|
||||||
if libAvailable is False:
|
if libAvailable is False:
|
||||||
return
|
return
|
||||||
|
@ -40,12 +43,13 @@ def initCL():
|
||||||
for platform in cl.get_platforms():
|
for platform in cl.get_platforms():
|
||||||
gpus.extend(platform.get_devices(device_type=cl.device_type.GPU))
|
gpus.extend(platform.get_devices(device_type=cl.device_type.GPU))
|
||||||
if BMConfigParser().safeGet("bitmessagesettings", "opencl") == platform.vendor:
|
if BMConfigParser().safeGet("bitmessagesettings", "opencl") == platform.vendor:
|
||||||
enabledGpus.extend(platform.get_devices(device_type=cl.device_type.GPU))
|
enabledGpus.extend(platform.get_devices(
|
||||||
|
device_type=cl.device_type.GPU))
|
||||||
if platform.vendor not in vendors:
|
if platform.vendor not in vendors:
|
||||||
vendors.append(platform.vendor)
|
vendors.append(platform.vendor)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
if (len(enabledGpus) > 0):
|
if enabledGpus:
|
||||||
ctx = cl.Context(devices=enabledGpus)
|
ctx = cl.Context(devices=enabledGpus)
|
||||||
queue = cl.CommandQueue(ctx)
|
queue = cl.CommandQueue(ctx)
|
||||||
f = open(os.path.join(paths.codePath(), "bitmsghash", 'bitmsghash.cl'), 'r')
|
f = open(os.path.join(paths.codePath(), "bitmsghash", 'bitmsghash.cl'), 'r')
|
||||||
|
@ -55,23 +59,29 @@ def initCL():
|
||||||
else:
|
else:
|
||||||
logger.info("No OpenCL GPUs found")
|
logger.info("No OpenCL GPUs found")
|
||||||
del enabledGpus[:]
|
del enabledGpus[:]
|
||||||
except Exception as e:
|
except Exception:
|
||||||
logger.error("OpenCL fail: ", exc_info=True)
|
logger.error("OpenCL fail: ", exc_info=True)
|
||||||
del enabledGpus[:]
|
del enabledGpus[:]
|
||||||
|
|
||||||
|
|
||||||
def openclAvailable():
|
def openclAvailable():
|
||||||
return (len(gpus) > 0)
|
"""Are there any OpenCL GPUs available?"""
|
||||||
|
return bool(gpus)
|
||||||
|
|
||||||
|
|
||||||
def openclEnabled():
|
def openclEnabled():
|
||||||
return (len(enabledGpus) > 0)
|
"""Is OpenCL enabled (and available)?"""
|
||||||
|
return bool(enabledGpus)
|
||||||
|
|
||||||
def do_opencl_pow(hash, target):
|
|
||||||
|
def do_opencl_pow(hash_, target):
|
||||||
|
"""Perform PoW using OpenCL"""
|
||||||
output = numpy.zeros(1, dtype=[('v', numpy.uint64, 1)])
|
output = numpy.zeros(1, dtype=[('v', numpy.uint64, 1)])
|
||||||
if (len(enabledGpus) == 0):
|
if not enabledGpus:
|
||||||
return output[0][0]
|
return output[0][0]
|
||||||
|
|
||||||
data = numpy.zeros(1, dtype=hash_dt, order='C')
|
data = numpy.zeros(1, dtype=hash_dt, order='C')
|
||||||
data[0]['v'] = ("0000000000000000" + hash).decode("hex")
|
data[0]['v'] = ("0000000000000000" + hash_).decode("hex")
|
||||||
data[0]['target'] = target
|
data[0]['target'] = target
|
||||||
|
|
||||||
hash_buf = cl.Buffer(ctx, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=data)
|
hash_buf = cl.Buffer(ctx, cl.mem_flags.READ_ONLY | cl.mem_flags.COPY_HOST_PTR, hostbuf=data)
|
||||||
|
@ -83,9 +93,8 @@ def do_opencl_pow(hash, target):
|
||||||
kernel.set_arg(0, hash_buf)
|
kernel.set_arg(0, hash_buf)
|
||||||
kernel.set_arg(1, dest_buf)
|
kernel.set_arg(1, dest_buf)
|
||||||
|
|
||||||
start = time.time()
|
|
||||||
progress = 0
|
progress = 0
|
||||||
globamt = worksize*2000
|
globamt = worksize * 2000
|
||||||
|
|
||||||
while output[0][0] == 0 and shutdown == 0:
|
while output[0][0] == 0 and shutdown == 0:
|
||||||
kernel.set_arg(2, pack("<Q", progress))
|
kernel.set_arg(2, pack("<Q", progress))
|
||||||
|
@ -96,20 +105,18 @@ def do_opencl_pow(hash, target):
|
||||||
cl.enqueue_copy(queue, output, dest_buf)
|
cl.enqueue_copy(queue, output, dest_buf)
|
||||||
queue.finish()
|
queue.finish()
|
||||||
progress += globamt
|
progress += globamt
|
||||||
sofar = time.time() - start
|
|
||||||
# logger.debug("Working for %.3fs, %.2f Mh/s", sofar, (progress / sofar) / 1000000)
|
|
||||||
if shutdown != 0:
|
if shutdown != 0:
|
||||||
raise Exception ("Interrupted")
|
raise Exception("Interrupted")
|
||||||
taken = time.time() - start
|
|
||||||
# logger.debug("Took %d tries.", progress)
|
# logger.debug("Took %d tries.", progress)
|
||||||
return output[0][0]
|
return output[0][0]
|
||||||
|
|
||||||
#initCL()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
target = 54227212183L
|
initCL()
|
||||||
initialHash = "3758f55b5a8d902fd3597e4ce6a2d3f23daff735f65d9698c270987f4e67ad590b93f3ffeba0ef2fd08a8dc2f87b68ae5a0dc819ab57f22ad2c4c9c8618a43b3".decode("hex")
|
target_ = 54227212183
|
||||||
nonce = do_opencl_pow(initialHash.encode("hex"), target)
|
initialHash = ("3758f55b5a8d902fd3597e4ce6a2d3f23daff735f65d9698c270987f4e67ad590"
|
||||||
trialValue, = unpack('>Q',hashlib.sha512(hashlib.sha512(pack('>Q',nonce) + initialHash).digest()).digest()[0:8])
|
"b93f3ffeba0ef2fd08a8dc2f87b68ae5a0dc819ab57f22ad2c4c9c8618a43b3").decode("hex")
|
||||||
print "{} - value {} < {}".format(nonce, trialValue, target)
|
nonce = do_opencl_pow(initialHash.encode("hex"), target_)
|
||||||
|
trialValue, = unpack(
|
||||||
|
'>Q', hashlib.sha512(hashlib.sha512(pack('>Q', nonce) + initialHash).digest()).digest()[0:8])
|
||||||
|
print "{} - value {} < {}".format(nonce, trialValue, target_)
|
||||||
|
|
Reference in New Issue
Block a user