[petsc-users] MKL BLAS interface inconsistency
Alexander Grayver
agrayver at gfz-potsdam.de
Thu Apr 5 06:54:26 CDT 2012
Hello,
The inconsistency is still there. I pulled petsc-dev today and came
across with the same problem:
src/vec/vec/impls/seq/bvec2.c
239: *z = PetscRealPart(BLASdot_(&bn,xx,&one,xx,&one));
240: *z = PetscSqrtReal(*z);
This doesn't work with Intel MKL. However in one of the mailing list
discussions it was said there is now check for that.
This check didn't work for me apparently. Any ideas why?
Regards,
Alexander
On 19.01.2012 17:55, Alexander Grayver wrote:
> This (dirty) patch solves the problem:
>
> diff -r a3e9ca59ab58 src/vec/vec/impls/seq/bvec2.c
> --- a/src/vec/vec/impls/seq/bvec2.c Tue Jan 17 22:04:05 2012 -0600
> +++ b/src/vec/vec/impls/seq/bvec2.c Thu Jan 19 17:28:39 2012 +0100
> @@ -232,12 +232,13 @@
> PetscErrorCode ierr;
> PetscInt n = xin->map->n;
> PetscBLASInt one = 1, bn = PetscBLASIntCast(n);
> + PetscScalar cnorm;
>
> PetscFunctionBegin;
> if (type == NORM_2 || type == NORM_FROBENIUS) {
> ierr = VecGetArrayRead(xin,&xx);CHKERRQ(ierr);
> - *z = BLASdot_(&bn,xx,&one,xx,&one);
> - *z = PetscSqrtReal(*z);
> + zdotc(&cnorm,&bn,xx,&one,xx,&one);
> + *z = PetscSqrtReal(PetscAbsScalar(cnorm));
> ierr = VecRestoreArrayRead(xin,&xx);CHKERRQ(ierr);
> ierr = PetscLogFlops(PetscMax(2.0*n-1,0.0));CHKERRQ(ierr);
> } else if (type == NORM_INFINITY) {
>
> The same is applied to mpi vector implementation from
> /petsc-dev/src/vec/vec/impls/mpi/pvec2.c
> Of course it works only if one uses Intel MKL BLAS/LAPACK and double
> complex arithmetics. Which is my case.
>
> On 19.01.2012 15:30, Alexander Grayver wrote:
>> Dear petsc team,
>>
>> I've been struggling with this problem for a long time and seeking
>> for your advice now.
>> Let's take simple petsc program:
>>
>> #include <petscksp.h>
>> int main(int argc,char **args)
>> {
>> Vec b;
>> PetscReal norm;
>>
>> PetscInitialize(&argc,&args,(char *)0,NULL);
>>
>> VecCreateSeq(PETSC_COMM_SELF,100,&b);
>> VecSet(b,2.0);
>> VecNorm(b,NORM_1_AND_2,&norm);
>>
>> return 0;
>> }
>>
>> This program works well if I compile petsc with non-mkl blas/lapack.
>> However, if I compile petsc with mkl blas/lapack this program crashes:
>>
>> zdotc, FP=7fff8f121e30
>> VecNorm_Seq, FP=7fff8f121f90
>> VecNorm_Seq, FP=7fff8f1220f0
>> VecNorm, FP=7fff8f122230
>> main, FP=7fff8f122290
>>
>> It crashes in zdotc. You call this routine as following:
>>
>> *z = BLASdot_(&bn,xx,&one,xx,&one);
>>
>> When I look at the zdotc interface in mkl.h I see:
>> void ZDOTC(MKL_Complex16 *pres, const MKL_INT *n, const
>> MKL_Complex16 *x, const MKL_INT *incx, const MKL_Complex16 *y, const
>> MKL_INT *incy);
>>
>> I also found example here:
>> http://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-blas-cblas-and-lapack-compilinglinking-functions-fortran-and-cc-calls/
>> There are 6 input parameters. But in "classical" BLAS implementation
>> 5 input and 1 output.
>>
>> For example, NORM_1 works well since interface to dzasum is the same.
>>
>> Any ideas?
>>
>
>
--
Regards,
Alexander
More information about the petsc-users
mailing list