Intel® oneAPI Math Kernel Library
Ask questions and share information with other developers who use Intel® Math Kernel Library.
7093 ディスカッション

segfault with dsctr blas routine

tletni
ビギナー
1,345件の閲覧回数
I am getting segfault with the dsctr function. Other blas routines work fine (dcopy, dsyrk, dpotrf). With the for loop implementation accessing the same things, everything works.

for (i=0; i = x;
//dsctr(&sep,x,&geom[3],tmp4);

This is on gcc 4.5.1, mkl 10.3 update 9

thanks
T




gcc -std=gnu99 -fpic -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -c n02.c -o n02.o

gcc -std=gnu99 -shared -L/opt/intel/composer_xe_2011_sp1.9.293/mkl/lib/intel64 -L/opt/intel/composer_xe_2011_sp1.9.293/compiler/lib/intel64 -lmkl_rt -lpthread n02.o -o n02.so


0 件の賞賛
8 返答(返信)
mecej4
名誉コントリビューター III
1,345件の閲覧回数
Segfaults can rarely be diagnosed and treated with only one or two lines of code given.
tletni
ビギナー
1,345件の閲覧回数
Beow is the entire function, compiled as in the original post, called from FreeMat.

Segfault occurs ony when dsctr function is not commented out, and occurs not when I manually (for loop) do what dsctr is doing.





#include
#include
#include
#include


double lprg(double *x, double *xx, int *geom, double *g, double *tmp1, double *tmp2, double *tmp3, double *tmp4) {
int sep = geom[0]*geom[1]-(((geom[1]-1)*geom[1])/2); double one = 1.0; double zero = 0; int info, i; double n=-geom[2];
double lp=1; int sz = geom[0]*geom[0]; int zeri = 0; int onei = 1; int j = 0;
printf("\n x \n"); for (i=0; i<2*geom[0]; i++) printf("%d %f ", i, x);
printf("\n xx \n"); for (i=0; i);
printf("\n geom \n"); for (i=0; i);
printf("\n g \n"); for (i=0; i<2*geom[0]; i++) printf("%d %f ", i, g);
printf("\n tmp1 \n"); for (i=0; i);
printf("\n tmp2 \n"); for (i=0; i);
printf("\n tmp3 \n"); for (i=0; i);
printf("\n tmp4 \n"); for (i=0; i);
dcopy(&sz,&zero,&zeri,tmp1,&onei);
for (i=0; i for (i=0; i = x;
dsctr(&sep,x,&geom[3],tmp4);
lp = 5;
printf("%f ", lp);
return lp;
}




FreeMat -nogui

import('/home/s/mlfm/n02dbg.so','lprg','lprg','double','double &x, double &xx, int32 &geom, double &g, double &tmp1, double &tmp2, double &tmp3, double &tmp4');
the = [1.5,3.4,2.8,1.1,3,3,0.3,0.7,0.4,0.7,0.5,0.2];
p = 6; q = 1;
x = eye(p)
geom = [p,q,100,1:p]
g = zeros(2*p,1)
tmp1 = zeros(p,p); tmp2 = zeros(p,p); tmp3 = zeros(p,p); tmp4 = zeros(p,p);
l = lprg(the,x,geom,g,tmp1,tmp2,tmp3,tmp4)




Ying_H_Intel
従業員
1,345件の閲覧回数
Hi tletni,

We haven't FreeMat-nogui , so can't do the test. just quick idea, would you please help to try to replace the singledynamic library"-lmkl_rt" with the static link mode:

-Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKLROOT)/lib/intel64/libmkl_sequential.a $(MKLROOT)/lib/intel64/libmkl_core.a -Wl,--end-group -lpthread

(as MKL link advisor suggestedhttp://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/)

and see if it is dynamic link issue or the function itself issue.

Thanks
Ying
tletni
ビギナー
1,345件の閲覧回数
Thanks for your reply.

FreeMat is freely available opensource, usually comes with the distro, 2 clicks and its installed (yast).

When I link statically, everything compiles fine, but when running, I get "MKL FATAL ERROR: Cannot load neither libmkl_mc3.so nor libmkl_def.so" even though I issued before starting FreeMat:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/composer_xe_2011_sp1.9.293/mkl/lib/intel64
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/composer_xe_2011_sp1.9.293/compiler/lib/intel64

and the 2 so files are present in these directories.


T



gcc -std=gnu99 -shared -Wl,--start-group /opt/intel/composer_xe_2011_sp1.9.293/mkl/lib/intel64/libmkl_intel_lp64.a /opt/intel/composer_xe_2011_sp1.9.293/mkl/lib/intel64/libmkl_intel_thread.a /opt/intel/composer_xe_2011_sp1.9.293/mkl/lib/intel64/libmkl_core.a -Wl,--end-group -L/opt/intel/composer_xe_2011_sp1.9.293/compiler/lib/intel64 -liomp5 -lpthread -lm -lm n02dbg.o -o n02dbg.so


same error when I put sequential.a

tletni
ビギナー
1,345件の閲覧回数
again, dsyrk, dpotrf functions work, as mentioned in the original post (OP), and added below, compiled as in OP, giving the mathematically correct answer returned to FreeMat.



#include
#include
#include
#include


double lprg(double *x, double *xx, int *geom, double *g, double *tmp1, double *tmp2, double *tmp3, double *tmp4) {
int sep = geom[0]*geom[1]-(((geom[1]-1)*geom[1])/2); double one = 1.0; double zero = 0; int info, i; double n=-geom[2];
double lp=1; int sz = geom[0]*geom[0]; int zeri = 0; int onei = 1; int j = 0;
printf("\n x \n"); for (i=0; i<2*geom[0]; i++) printf("%d %f ", i, x);
printf("\n xx \n"); for (i=0; i);
printf("\n geom \n"); for (i=0; i);
printf("\n g \n"); for (i=0; i<2*geom[0]; i++) printf("%d %f ", i, g);
printf("\n tmp1 \n"); for (i=0; i);
printf("\n tmp2 \n"); for (i=0; i);
printf("\n tmp3 \n"); for (i=0; i);
printf("\n tmp4 \n"); for (i=0; i);
dcopy(&sz,&zero,&zeri,tmp1,&onei);
for (i=0; i for (i=0; i = x;
// dsctr(&sep,x,&geom[3],tmp4);
// for (i=0; i);
dsyrk("u","n",&geom[0],&geom[1],&one,tmp4,&geom[0],&one,tmp1,&geom[0]); // t(lam)*lam+diag(sig)
dpotrf("u",&geom[0],tmp1,&geom[0],&info); //LU-decomposition
lp = 5;
printf("%f ", lp);
return lp;
}

mecej4
名誉コントリビューター III
1,345件の閲覧回数
> FreeMat is freely available opensource, usually comes with the distro, 2 clicks and its installed (yast).

Yes, if you have a Linux distribution that uses YAST. I can also download the source of the Linux kernel but I am certainly not going to rebuild it to find a Fortran bug.

I think that it is too much to expect someone else to build a thirdy party software from source merely to help you with a bug. I suggest that we break the problem up.

1. On your installation, print out the arguments to the Fortran function/subroutine just before that routine gets called from FreeMat (or some thirdy party software). If that is too difficult, do the printing as the first executable statement in the Fortran routine -- this will work only if the subroutine linkage is already correct.

2. Write a small Fortran driver to call the subroutine with the arguments that you collected in 1. If the error goes away, then the problem is not with the Fortran code or the Intel compiler, but with FreeMat and how it calls Fortran routines. If the error remains, it should be easy to get assistance to fix here. Post the driver and the subroutine(s).
Ying_H_Intel
従業員
1,345件の閲覧回数
Hi tletni,

I installed onedistr:FreeMat-4.1.fc14.x86_64.rpm, but it seems failed as i haven'trelated Linuxdistro and related library, so not move forword

But i tried the related c code, add a main() under your functions.

int main(){
double the[]={1.5,3.4,2.8,1.1,3,3,0.3,0.7,0.4,0.7,0.5,0.2};
int p =6;
int q =1;
double x[6*6]={0.0};

for (int i=0; i<6; i++)
x[i*6+i]=1.0;

int geom[9]={6,1, 100, 1, 2, 3, 4, 5, 6};
double g[12]={0.0};
double tmp1[36]={0.0};

double tmp2[36]={0.0};
double tmp3[36]={0.0};
double tmp4[36]={0.0};

double lp= lprg(the,x, geom, g, tmp1, tmp2, tmp3,tmp4);

return 0;
}

Same as your gcc commands, just remove -shared, thusget a exe. It can run no problem with MKL 10.3. 9and-lmkl_rt.
The problemlooks betweenFreeMat and on.so .

Regarding the static link , It product the error, likeMKL FATAL ERROR: Cannot load neither libmkl_mc3.so nor libmkl_def.so".The resultis unexpected as libmkl_mc3.so and libmkl_def.so are dynamic library. So it shoud hint there is some MKLdynamic library was linked in your binary. Could you please check if the old '/home/s/mlfm/n02dbg.so' have been updated?
or > ldd '/home/s/mlfm/n02dbg.so' and let us know the result.

Best Regards,
Ying

tletni
ビギナー
1,345件の閲覧回数
Actually, I lied. I did not compile the way I said. I had other libs liked to, too. R.h Rmath.h, -L/usr/lib64/R/lib -lR and such. removing these solved the problem somehow. Maybe there was some interaction, since R was built to link against MKL, too. So problem solved, but I will post with another problem, that my function is not using multithreading.
返信