On Fri, Aug 27, 2010 at 6:14 PM, Lisandro Dalcin <span dir="ltr"><<a href="mailto:dalcinl@gmail.com">dalcinl@gmail.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
I cannot figure out how to implement a copy-free and safe<br>
VecGetArray()/VecRestoreArray() pattern in Python (not even by using<br>
the 'with' statement, it leaks the target variable!!!!).<br>
<br>
1) Provide a 100% safe but slow, copy-based way:<br>
<br>
a = x.getArray() #gives you a copy. It is implemented with<br>
VecGetArrayRead(x, &p), memcpy p->a.data, VecRestoreArray(x,&p) on a<br>
freshly allocated numpy array that is returned to the user.<br>
a.base is None # True, the array owns its memory buffer<br>
x.setArray(a) #writes array on the vector. It is implemented with<br>
VecGetArray(x,&p) and memcpy a.data -> p, VecRestoreArray(x,&p)<br>
<br>
<br>
2) Provide a unsafe but fast, copy-free way to get a numpy array<br>
sharing memory with PETSc vectors:<br>
<br>
a = numpy.asarray(x) # gives you a numpy array that shares mem with<br>
the vec, it is implemented with VecGetArray() and special Python/NumPy<br>
protocols for buffer sharing.<br>
a.base is x # True, the base attr holds a ref to the Vec instance, the<br>
array does not own its memory buffer.<br>
del a # force garbage collection explicitily, then VecRestoreArray()<br>
will be called when a gets deallocated.<br>
<br>
Relying in explicit use of del for garbage collection is not reliable.<br>
NumPy is designed to support array views, these views hold references<br>
to the base array. So users have to be very careful about how the<br>
arrays obtained the fast way are used.<br>
<br>
<br>
Comments ? Suggestions? Complaints?</blockquote><div><br></div><div>I am for 2). PETSc users generally want to sacrifice safety for performance.</div><div><br></div><div>   Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font color="#888888"><br>
--<br>
Lisandro Dalcin<br>
---------------<br>
CIMEC (INTEC/CONICET-UNL)<br>
Predio CONICET-Santa Fe<br>
Colectora RN 168 Km 472, Paraje El Pozo<br>
Tel: +54-342-4511594 (ext 1011)<br>
Tel/Fax: +54-342-4511169<br>
</font></blockquote></div><br><br clear="all"><br>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>-- Norbert Wiener<br>