Hello,
I am having trouble with some PyOpenCL code. When I run it, it will execute a
few commands properly, then fail with "invalid command queue". I searched for
this on Google, and found a recommendation that I add some error handlers
(http://www.khronos.org/message_boards/viewtopic.php?f=28&t=2061) to the
context.
How do I do get this additional error information in PyOpenCL? Or is there some
other way to figure out what is causing the command queue to become invalid?
Stack Trace:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 59, in test_visual_cortex
net.update_weights()
File "cortex.py", line 182, in update_weights
return sum([x.do_learning() for x in self.layers])
File "cortex.py", line 570, in do_learning
total_change = sum(x.do_XCAL() for x in self.connections)
File "cortex.py", line 570, in <genexpr>
total_change = sum(x.do_XCAL() for x in self.connections)
File "cortex.py", line 1015, in do_XCAL
cl_do_xcal(self.source_activations(),self.source_idxs_cl,self.dest.act_cl,self.dest.act_l_cl,self.weights_cl,eta).wait()
File "visual_cortex.py", line 215, in source_activations
c.queue.finish()
pyopencl.LogicError: clFinish failed: invalid command queue
Relevant code:
test_visual_cortex() is the main function called. It builds a neural network,
then calls reset_act(), update_activations(), and update_weights(). Each of
these three functions has PyOpenCL calls, and they all appear to function
properly until the crash happens. This code previously used Numpy for all array
operations, and worked well. I am moving to OpenCL in order to improve
performance.
def test_visual_cortex():
net = v.build_visual_cortex_3('../data/objrec
tests/opencl-test/',scale_gabor=True)
input = net.get_layer('Gabor')
img_path = '../facial/train/018_a2.pgm'
input.load_image(img_path,randomize=False)
[x.reset_act() for x in net.layers]
net.update_activations()
net.update_weights()
def update_activations(self):
''' update_activations(): update activations of all layers in
network
inputs
none
outputs
maximum change for any layer
effects
updates the activations for every layer in the network
via the
calc_activation() method
'''
changes = [x.calc_activation() for x in self.layers]
return max(changes)
def update_weights(self):
''' update_activations(): update activations of all layers in
network
inputs
none
outputs
sum of weight change
effects
updates the weights for every layer in the network via
the do_learning()
method
'''
return sum([x.do_learning() for x in self.layers])
def calc_activation(self):
''' calc_activation(): calculate activation of each neuron in
this layer
algorithm
calculate strength of each connection
sum for each neuron in this layer
do sigma function
set activations based on kWTA
output
sum of absolute value of change in activation this time
effects
updates self.activations
'''
if len(self.connections) == 0:
return 0
if not self.clamped:
if USE_GPU:
inputs = [x.get_net_i() for x in
self.connections]
net_i = cl_a.zeros_like(self.act_cl)
queue.finish()
for input in inputs:
# print input
net_i = net_i + input
queue.finish()
# debug
print "calc_activation in",self.name
print "queue:",queue
device =
queue.get_info(cl.command_queue_info.DEVICE)
print "DEVICE:",device
print
"MEM_SIZE:",device.get_info(cl.device_info.GLOBAL_MEM_SIZE)
print
"AVAILABLE:",device.get_info(cl.device_info.AVAILABLE)
# end debug
net_i = net_i/np.float32(len(self.connections))
queue.finish()
thresh = self.kWTA(net_i)
y = net_i - np.float32(thresh)
queue.finish()
y = cl_a.maximum(y,cl_a.zeros_like(y))
queue.finish()
new_act = self.amplify_activation(y)
old_act = self.act_cl
#self.act_cl = old_act + dt*(new_act - old_act)
temp_act = cl_a.zeros_like(old_act)
queue.finish()
cl_calc_activation(old_act,dt,new_act,temp_act).wait()
self.act_cl = temp_act
def do_XCAL(self):
''' do_XCAL(): perform XCAL learning algorithm on all connections
algorithm
get xy averages
calculate necessary change in weight using xcal function
modify weights based on learning rate
update xy_m averages
output
None **not done anymore: float describing total change in
weights**
effects
weights and xy_m changed for each connection
'''
total_change = 0.0
if not self.fixed_weights:
if USE_GPU:
cl_do_xcal(self.source_activations(),self.source_idxs_cl,self.dest.act_cl,self.dest.act_l_cl,self.weights_cl,eta).wait()
def source_activations(self):
''' source_activations(): get the proper channel of gabor_data
returns
numpy array for source activations
'''
if c.USE_GPU:
height = self.source.gabor_data.shape[0]
orien_idx = self.orientation_idx
num_oriens = 4
idxs =
c.cl_a.arange(c.queue,orien_idx,orien_idx+height*num_oriens,num_oriens,dtype=np.int32)
print c.queue
c.queue.finish()
Thanks,
Lewis Anderson_______________________________________________
PyOpenCL mailing list
[email protected]
http://lists.tiker.net/listinfo/pyopencl