<div dir="ltr">Hi Karl,<div><br></div><div>I've been testing further, the code using TS with ViennaCL and there are a couple of things I wanted to point out</div><div><br></div><div>1) When using the ComputeResidualViennaCL with either the normal Petsc Vecs/Mats or Vec/MatViennaCL, and using the GPU, the nonlinear convergence is very different from using an OpenCL CPU backend or just the regular Petsc code.</div>
<div><br></div><div>a) Using NVIDIA OpenCL to run on the GPU to compute the residual and using either normal Petsc Vec/Mat or ViennaCL Vec/Mat:</div><div><br></div><div><div>0 TS dt 10 time 0</div><div>    0 SNES Function norm 4.789374470711e-01</div>
<div>    1 SNES Function norm 5.491749197245e-02</div><div>    2 SNES Function norm 6.542412564158e-03</div><div>    3 SNES Function norm 7.800844032317e-04</div><div>    4 SNES Function norm 9.349243191537e-05</div><div>
    5 SNES Function norm 1.120692741097e-05</div><div>1 TS dt 10 time 10</div></div><div><br></div><div>b) Using Intel OpenCL to run on the CPU to compute the residual and using either normal Petsc Vec/Mat or ViennaCL Vec/Mat::</div>
<div><br></div><div><div>0 TS dt 10 time 0</div><div>    0 SNES Function norm 3.916582465172e-02</div><div>    1 SNES Function norm 4.990998832000e-07</div></div><div><br></div><div>c) Using ComputeResidual (which runs on the CPU) with the normal Petsc Vec/Mat</div>
<div><br></div><div><div>0 TS dt 10 time 0</div><div>    0 SNES Function norm 3.916582465172e-02</div><div>    1 SNES Function norm 4.990998832000e-07</div><div>1 TS dt 10 time 10</div></div><div><br></div><div>You see that b) and c) match perfectly but a) is quite different. Why could this be?</div>
<div><br></div><div>I also tried with the option -pc_type none cause I thought the GPU preconditioners don't exist yet and I still get the above.</div><div><br></div><div>You can try with the attached code. I bumped up DOF to 8 and N1 and N2 to 128 each. </div>
<div>Run command:</div><div>./petsc_opencl -ts_monitor -snes_monitor -ts_max_steps 100 -ts_type theta -ts_dt 10 -snes_rtol 1e-4 -ts_final_time 1000 -pc_type none<br></div><div><br></div><div>2) When I try using either ComputeResidual or ComputeResidualViennaCL with the ViennaCL Vec/Mats, the GPU run crashes at a late time because of a routine in ViennaCL.</div>
<div><br></div><div><div>ViennaCL: FATAL ERROR: Kernel start failed for 'vec_mul'.</div></div><div><div>ViennaCL: Smaller work sizes could not solve the problem. </div><div>[0]PETSC ERROR: --------------------- Error Message ------------------------------------</div>
<div>[0]PETSC ERROR: Error in external library!</div><div>[0]PETSC ERROR: ViennaCL error: ViennaCL: FATAL ERROR: CL_MEM_OBJECT_ALLOCATION_FAILURE </div></div><div><br></div><div>I have attached the full crash log. The crash occurs late into the run, in this case at the 80th time step. I thought all memory allocation occurs at the beginning of the run, so I don't quite understand why its failing. Note that the code works if I use ComputeResidualViennaCL with the normal Petsc Vec/Mats.</div>
<div><br></div><div>Cheers,</div><div>Mani</div><div><br></div></div>