- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
When I use vdRngUniform() routine to create a random matrix, the maximum size matrix I can use only 40000 x 40000. Do we have any other routine from MKL to create with the bigger size? I can create by the normal way on C but it affects performance. So please guide me with other routines from MKL
Thanks.
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Nguyen,
I suggest to continue use vdRngUniform() routine with generation by blocks.
Here I mean that you can generate matrix of the needed size block by block, as shown below:
VSLStreamStatePtr stream;
vslNewStream( &stream, BRNG, SEED );
const int64_t size = 40000*40000;
const int64_t block_size = 1000;
double* matrix;
matrix = (double*) malloc (size*sizeof(double));
for(int64_t i = 0; i < size; i+=block_size) {
vdRngUniform( VSL_RNG_METHOD_UNIFORM_STD, stream, block_size, matrix + i, 0.0, 1.0 );
}
free(matrix);
vslDeleteStream( &stream );
Please, let me know, if it addresses your question.
Best regards,
Pavel
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
plus two cents - I am not sure if using RNGUniform is important to your case, but you may take a look at the https://software.intel.com/en-us/mkl-developer-reference-c-lagge routine which generates M x N matrix. You may link with ILP64 mkl API and generate matrix beyond of 40k by 40K
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Pavel,
Your program is correct with size 40000x40000 but with the bigger size as 50000x50000 it will be fault "Segmentation fault (core dumped)".
Please tell me if you have another way to solve this problem.
Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Gennady F.,
Thanks for your recommendation but I also have a problem, please see my program:
#include "stdio.h" #include "mkl.h" #include "mkl_lapack.h" #define LAPACK_ROW_MAJOR 101 #define LAPACK_COL_MAJOR 102 #define MIN(a,b) ((a < b) ? (a) : (b)) double main() { int m = 5000; int n = 5000; int kl = m-1 ; int ku = n-1; int len_d = MIN(m,n); const double *d ; double *a; int lda = n ; int * iseed; *iseed = 999; a = (double *)malloc(m*n*sizeof(double)); d = (double *)malloc(len_d*sizeof(double)); LAPACKE_dlagge (LAPACK_ROW_MAJOR , m , n , kl , ku , &d[0] , &a[0] , lda , iseed ); free(a); }
icc -I/opt/intel/compilers_and_libraries_2018.5.274/linux/mkl/include/ -mkl -lmkl_intel_ilp64 matrix.c -o matrix
In this case, I want sure it works well with the small size before I check bigger than 40000x40000. But it shows me the error "Intel MKL ERROR: Parameter 4 was incorrect on entry to DLAGGE."
Do you know how to fix the problem?
Thanks.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Nguyen,
I think that the root cause of your problem is integer overflow.
To avoid it you can change the line with size in my program as follows:
const int64_t size = (int64_t)50000*(int64_t)50000;
I checked the program with 100 000 x 100 000 size – it works fine.
Hope it helps you.
Best regards,
Pavel
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
if you link with ILP64 lib, then you have to use -DMKL_ILP64 compiler option. Please refer the mkl linker adviser or mkl user guide for more details

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page