<div dir="ltr"><div><div><div><div><div><div>Hi,<br><br></div>Following <a href="http://www.mcs.anl.gov/petsc/petsc-20/conference/Rupp_K.pdf">http://www.mcs.anl.gov/petsc/petsc-20/conference/Rupp_K.pdf</a> (page 16), I ran KSP ex12 for two cases:<br><br></div>1) time ./ex12 -m 100 -n 100 -log_summary > log_summary_no_viennacl<br><br>real    0m0.213s<br>user    0m0.206s<br>sys     0m0.004s<br><br>2) ./ex12 -m 100 -n 100 -vec_type viennacl -mat_type aijviennacl -log_summary > log_summary_with_viennacl<br><br>real    0m20.296s<br>user    0m46.025s<br>sys     0m1.435s<br><br></div>The runs have been performed on a CPU : AMD A10-5800K, with OpenCL from AMD-APP-SDK-v3.0.<br><br></div><div>Attached are:<br></div><div>1) configure.log for the petsc build<br></div><div>2) log summary without viennacl<br></div><div>3) log summary with viennacl<br></div><div>4) OpenCL info for the system on which the runs were performed<br><br></div><div>Perhaps the reason for the slow performance are superfluous copies being performed, which need not occur when running ViennaCL on the CPU. Looking at <a href="http://www.mcs.anl.gov/petsc/petsc-dev/src/vec/vec/impls/seq/seqviennacl/vecviennacl.cxx">http://www.mcs.anl.gov/petsc/petsc-dev/src/vec/vec/impls/seq/seqviennacl/vecviennacl.cxx</a>:<br><pre>/* Copies a vector from the CPU to the GPU unless we already have an up-to-date copy on the GPU */
PetscErrorCode VecViennaCLCopyToGPU(Vec v)
{
  PetscErrorCode ierr;

  PetscFunctionBegin;
  ierr = VecViennaCLAllocateCheck(v);CHKERRQ(ierr);
  if (v->map->n > 0) {
    if (v->valid_GPU_array == PETSC_VIENNACL_CPU) {
      ierr = PetscLogEventBegin(VEC_ViennaCLCopyToGPU,v,0,0,0);CHKERRQ(ierr);
      try {
        ViennaCLVector *vec = ((Vec_ViennaCL*)v->spptr)->GPUarray;
        viennacl::fast_copy(*(PetscScalar**)v->data, *(PetscScalar**)v->data + v->map->n, vec->begin());
        ViennaCLWaitForGPU();
      } catch(std::exception const & ex) {
        SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_LIB,"ViennaCL error: %s", ex.what());
      }
      ierr = PetscLogEventEnd(VEC_ViennaCLCopyToGPU,v,0,0,0);CHKERRQ(ierr);
      v->valid_GPU_array = PETSC_VIENNACL_BOTH;
    }
  }
  PetscFunctionReturn(0);
}<br><br></pre></div>When running ViennaCL with OpenCL on the CPU, the above function should maybe be modified?<br><br></div>Cheers,<br></div>Mani<br><div><div><div><div><div><div><div><div><div><br></div></div></div></div></div></div></div></div></div></div>