Merge pull request #119 from twombly-sys/unstable

alloca.h breaks the build on openbsd/freebsd
parameter change
fix analyzer warnings
try fix all analyzer errors again
hack around to force GPU
revert commented out code
get to the bottom of this issue

So, this issue is very interesting and in this rare case, I will
document in the commit message.

When I sum all the gradients from all batches for convolutional layers,
I do the sum on device 0. device 0 will wait other devices to finish and
then sum. However, at that point, other devices are free to proceed. In
this case, when other devices proceed to next instruction, its gradients
will set to 0. Thus, when device 0 tries to communicate / copy over the
gradients from other devices, there is a large chance these gradients
are 0 (because the next issued function is memset). It basically like to
update full connect layer with all batches, but convolutional layer with
only batch on device 0. The mis-match caused that with multiple GPUs,
I cannot get MattNet's result any more.
parallelize scd a bit