Currently, Aparapi only supports synchronous data transfers. OpenCL supports both synchronous and asynchronous data transfers.
Excellent article (by a gentleman who apparently used to work at PNNL):
http://www.codeproject.com/Articles/201258/Part-5-OpenCL-Buffers-and-Memory-Affi
nity
<snip>
"Explicit, programmer initiated transfers occur by queuing one or more transfers on a command queue. Examples include:
C API:
clEnqueueReadBuffer(), clEnqueueReadImage()
clEnqueueWriteBuffer(), clEnqueueWriteImage()
clEnqueueCopyBuffer(), clEnqueueCopyImage()
C++ API
cl::enqueueReadBuffer(), cl::enqueueWriteBuffer()
Data transfers can be either blocking, in which case the queue waits for the transfer to complete, or asynchronous requiring the use of events for notification when a transfer has completed. Using asynchronous data transfers benefits application performance by allowing computation to overlap with data movement - thus decreasing the time to solution. Since the PCIe bus is full duplex, meaning that it can transfer data in two directions at the same time, there is a potential 2-times increase in data transfer bandwidth that can be achieved.
Alternatively, regions of the object data can be implicitly transferred by mapping buffers into the host address space. These transfers can occur both asynchronously and on a demand basis, meaning only portions of the data required by a calculation are moved and cached on a device. API examples include:
C API:
clEnqueueMapBuffer(), clEnqueueMapImage()
clEnqueueUnmapMemObject()
C++ API:
cl::Buffer() (via various flags discussed below)
cl::enqueueMapBuffer(), cl::enqueueMapImage()
cl::enqueueUnmapMemObject();"
There is a lot of great information in that article.
Original issue reported on code.google.com by
ryan.lam...@gmail.comon 11 Aug 2012 at 10:33