Spike::GPU needs to be reset if any of the options are changed. The solver is currently created in the system constructor, so any changes to the solver options will required the solver to be reset.
The code should be changed so that setup() is called during the initialize() function.
Apart from the marginally more complicated specification of the index arrays, is there a reason why you use COO format as opposed to say CSR? If I am not mistaken, the cusp::multiply() algorithm should be more efficient for SPMV operations when using CSR vs. COO.