- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi all,
I' ve got a simple example from http://software.intel.com/sites/products/documentation/doclib/mkl_sa/11/mklman/index.htm
which works fine.
I wrote the pretty similar code
#include <stdio.h>
#include "mkl.h"
#include "errcheck.inc"
#define NPART 10
#define NDIM 2
#define STREAMFILENAME "task.stream"
int main(){
VSLStreamStatePtr stream;
FILE* streamfile;
int errcode=0;
double *r=malloc(NPART*NDIM*sizeof(double));
double M[]={1e0,0e0},S[]={1e0,1e0};
VSLSSTaskPtr task;
double *m=malloc(NDIM*sizeof(double));
MKL_INT rstorage=VSL_SS_MATRIX_STORAGE_ROWS;
int ipart=0,idata=0,idim=0;
MKL_INT npart=NPART,ndim=NDIM,xstorage=VSL_SS_MATRIX_STORAGE_COLS;
streamfile=fopen(STREAMFILENAME,"r");
if(streamfile){
fclose(streamfile);
errcode=vslLoadStreamF(&stream,STREAMFILENAME);
}else{
errcode=vslNewStream(&stream,VSL_BRNG_MCG31,7777777);
}
errcode=vdRngGaussianMV(VSL_RNG_METHOD_GAUSSIANMV_BOXMULLER2,stream,
NPART,(double*)r,NDIM,VSL_MATRIX_STORAGE_DIAGONAL,M,(double*)S);
errcode=vsldSSNewTask(&task,&npart,&ndim,&xstorage,r,0,0);
errcode=vsldSSEditTask(task,VSL_SS_ED_MEAN,m);
errcode=vsldSSCompute(task,VSL_SS_MEAN,VSL_SS_METHOD_FAST);
errcode=vslSSDeleteTask(&task);
CheckVslError(errcode);
for(idim=0;idim<NDIM;idim++)printf("%20.16e ",m[idim]);
printf("\n"); free(r);
free(m);
errcode=vslSaveStreamF(stream,STREAMFILENAME);
return 0;
}
this wont work at all. I can compile and run, but a fatal error occurs
in between vsldSSCompute and result printing.
Where am I doing the error? Can someone help me?
Thanks!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Fabio,
You generate 10 vectors of size 2 with MKL multi-variate version of Gaussian RNG, thus, the dimension of Summary Stats task p should be set to 2, and number of observations n - to 10. Please, replace the line errcode=vsldSSNewTask(&task,&npart,&ndim,&xstorage,r,0,0); with errcode=vsldSSNewTask(&task,&ndim, &npart,&xstorage,r,0,0);
Also, do not forget to delete the memory allocated for need of random number generation via call to the function vslDeleteStream();
Please, let me know if it answers your question.
Andrey
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Fabio,
You generate 10 vectors of size 2 with MKL multi-variate version of Gaussian RNG, thus, the dimension of Summary Stats task p should be set to 2, and number of observations n - to 10. Please, replace the line errcode=vsldSSNewTask(&task,&npart,&ndim,&xstorage,r,0,0); with errcode=vsldSSNewTask(&task,&ndim, &npart,&xstorage,r,0,0);
Also, do not forget to delete the memory allocated for need of random number generation via call to the function vslDeleteStream();
Please, let me know if it answers your question.
Andrey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Andrey,
thanks, that was the fault! I am guessing if the array-linear representation
I am using and called in the routine vsldSSNewTask is either the
{x_0,y_0,...,x_npart,y_npart}
or
{x_0,...,x_npart,y_0,...,y_npart}
?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Fabio,
MKL Multi-variate Gaussian RNG packs the numbers in column-major format, that is
{ (x(0),y(0)),
(x(1),y(1)),
(x(2),y(2)),
...
};
So, in your example you correctly specified the storage format for the dataset xstorage=VSL_SS_MATRIX_STORAGE_COLS;
Andrey
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
OK! Thank you very much for everything!
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page