[petsc-dev] Petsc+ViennaCL usage
Mani Chandra
mc0710 at gmail.com
Tue Jan 21 11:21:47 CST 2014
I like to pass in "-cl-nv-verbose" for compilation on nvidia cards. Also, I
pass in parameters, for ex "-D Nx=128 -D Ny=128". I'll look at the ViennaCL
api.
Thanks,
Mani
On Tue, Jan 21, 2014 at 3:28 AM, Karl Rupp <rupp at mcs.anl.gov> wrote:
> Hi Mani,
>
>
> > I have a few questions regarding the usage of Viennacl in Petsc.
>
>>
>> 1) In the residual evaluation function:
>>
>> PetscErrorCode ComputeResidual(TS ts,
>> PetscScalar t,
>> Vec X, Vec dX_dt,
>> Vec F, void *ptr)
>> {
>> DM da;
>> Vec localX;
>> TSGetDM(ts, &da)
>> DMGetLocalVector(da, &localX);
>>
>> DMGlobalToLocalBegin(da, X, INSERT_VALUES, localX);
>> DMGlobalToLocalEnd(da, X, INSERT_VALUES, localX);
>>
>> viennacl::vector<PetscScalar> *x, *f;
>> VecViennaCLGetArrayWrite(localX, &x);
>> VecViennaCLGetArrayRead(F, &f);
>>
>> viennacl::ocl::enqueue(myKernel(*x, *f));
>> //Should it be viennacl::ocl::enqueue(myKernel(x, f))?
>>
>
> It should be viennacl::ocl::enqueue(myKernel(*x, *f));
> Usually you also want to pass the sizes to the kernel. Don't forget to
> cast the sizes to the correct types (e.g. cl_uint).
>
>
>
> VecViennaCLRestoreArrayWrite(localX, &x);
>> VecViennaCLRestoreArrayRead(F, &f);
>> DMRestoreLocalVector(da, &localX);
>> }
>>
>> Will the residual evaluation occur on the GPU/accelerator depending on
>> where we choose the ViennaCL array computations to occur? As I
>> understand, if we simply use VecGetArray in the residual evaluation
>> function, then the residual evaluation is still done on the CPU even
>> though the solves are done on the GPU.
>>
>
> If you use VecViennaCLGetArrayWrite(), the data will be valid on the GPU,
> so your residual evaluation should happen in the OpenCL kernel you provide.
> This is already the case in the code snippet above.
>
>
>
> 2) How does one choose on which device the ViennaCL array computations
>> will occur? I was looking for some flags like -viennacl
>> cpu/gpu/accelerator but could not find any in -help.
>>
>
> Use one out of
> -viennacl_device_cpu
> -viennacl_device_gpu
> -viennacl_device_accelerator
>
>
>
> 3) How can one pass compiler flags when building OpenCL kernels in
>> ViennaCL?
>>
>
> You could do that through the ViennaCL API directly, but I'm not sure
> whether you really want to do this. Which flags do you want to set? My
> experience is that these options have little to no effect on performance,
> particularly for the memory-bandwidth-limited case. This is also the reason
> why I haven't provided a PETSc routine for this.
>
> Best regards,
> Karli
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20140121/bfb0d8b5/attachment.html>
More information about the petsc-dev
mailing list