С помощью библиотеки MKL создаем случайную матрицу - PullRequest
0 голосов
/ 01 апреля 2020

Когда я использую подпрограмму vdRngUniform () для создания случайной матрицы, я могу использовать матрицу максимального размера только 40000 x 40000. Есть ли у нас какие-либо другие подпрограммы из MKL для создания с большим размером? Я могу создать обычным способом на C, но это влияет на производительность. Поэтому, пожалуйста, ведите меня с другими процедурами из MKL.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

следует добавить одну заметку - работая с такими размерами проблемы (> 40 КБ), пользователи должны связываться с версией библиотек MKL ILP64 и соответственно использовать параметры компилятора -DMKL_ILP64.

0 голосов
/ 02 апреля 2020

Поскольку этот вопрос также рассматривается на форуме Intel MKL, я публикую ответы здесь на тот случай, если другие заинтересуются. Ссылка на Intel MKL Forum: https://software.intel.com/en-us/forums/intel-math-kernel-library/topic/851713

Мы предлагаем продолжить использование подпрограммы vdRngUniform () с генерацией по блокам. Вы можете генерировать матрицу нужного размера блок за блоком, как показано ниже.

Кроме того, не уверен, что использование RNGUniform важно для вашего случая, но вы можете взглянуть на процедуру https://software.intel.com/en-us/mkl-developer-reference-c-lagge, которая генерирует матрицу M x N. Вы можете связать с ILP64 mkl API и сгенерировать матрицу за 40k к 40K

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 );
...