<div dir="ltr"><div>Perhaps one can do cudaGetDevice() and cudaDeviceReset() in between the two calls to PetscInitialize in the application code? </div><div>Provided no device data was allocated in between the two calls, this might eliminate the error.</div>
<div> </div><div>If you are doing this with multiple host threads (especially where the # of CPU threads > # of GPUs), special care is required. </div><div> </div><div>-Paul</div></div><div class="gmail_extra"><br><br>
<div class="gmail_quote">On Tue, Oct 8, 2013 at 6:04 PM, Jed Brown <span dir="ltr"><<a href="mailto:jedbrown@mcs.anl.gov" target="_blank">jedbrown@mcs.anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">Harshad Sahasrabudhe <<a href="mailto:hsahasra@purdue.edu">hsahasra@purdue.edu</a>> writes:<br>
> You are right, it doesn't if you use just one PETSc. In our case, we<br>
> use 2 PETSc libraries (compiled separately, one each for complex and<br>
> double).<br>
<br>
</div>Please remind us of this when you write.  We don't know everyone in your<br>
group at Purdue and it would simplify our figuring out what could cause<br>
the weird problems you encounter.<br>
<div class="im"><br>
> And in that case, when the second PETSc library is initialized,<br>
> cudaSetDevice throws an error. I can't think of any way in which both<br>
> the PETSc libraries could be initialized with CUDA on the same<br>
> process.<br>
<br>
</div>This is a general issue of interoperability between multiple libraries<br>
that want to use CUDA.  How can we find out if someone else has already<br>
called cudaSetDevice?<br>
</blockquote></div><br></div>