GPULib 1.0 was announced yesterday.
If you have been using the pre-release, the biggest new feature of the IDL bindings are the function forms of the routines. For example, it is possible to do:
IDL> gpuinit
IDL> x = findgen(360) * !dtor
IDL> y = 2 * findgen(360) * !dtor
IDL> z_gpu = gpusin(gpumult(x, y)) ; z = sin(x * y)
IDL> plot, gpugetarr(z_gpu)
IDL> gpuFree, z_gpu
This computes z = sin(x *y)
in a much more readable form than the procedural interface and does not leak any memory. In general, there are two bottlenecks to fast GPU computation: allocating memory on the GPU and transfer between CPU and GPU. Keeping results on the GPU and doing many calculations before transferring a final result to the CPU is desirable. Also, reusing variables for multiple calculations can help. This was straight-forward to do using the procedure interface, but how to specify a return variable to a function? Use the LHS
keyword. For instance, the above calculation could be done using a pre-defined z_gpu
:
IDL> gpuinit
IDL> x = findgen(360) * !dtor
IDL> y = 2 * findgen(360) * !dtor
IDL> z_gpu = gpuFltarr(360)
IDL> z_gpu = gpusin(gpumult(x, y, LHS=z_gpu), LHS=z_gpu)
IDL> plot, gpugetarr(z_gpu)
IDL> gpuFree, z_gpu
It is possible to program as efficiently as the procedure forms with the function forms of the routines by using LHS
, so make good use of them!
Full disclosure: I work for Tech-X Corporation and worked on the IDL bindings and examples for GPULib.
November 21st, 2008 at 2:07 pm
Couldn’t figure out what the heck the LHS keyword was good for. But, praise the Lord, now I’ve seen the light. Thanks Mike.