MKL Прямоугольная матрица на месте транспонирования: не использовать несколько ядер? - PullRequest
0 голосов
/ 13 мая 2019

Я хочу, чтобы на месте транспонировалась память очень большой матрицы. Я использую mkl_simatcopy. Но я наблюдаю некоторые проблемы с производительностью при перемещении на месте. В настоящее время я использую процессор Intel® R Xeon® E7-8867 v4 @ 2,40 ГГц с 72 физическими ядрами и ОС RedHat.

По моим наблюдениям, когда я выполняю операцию транспонирования, используется только одно ядро, а не все ядра. Я перепробовал все переменные окружения, такие как MK_NUM_THREADS, MKL_DYNAMIC="FALSE" и т. Д. Мой сценарий компиляции выглядит следующим образом:

gcc  -std=c99    -m64 -I $MKLROOT/include transpose.c  
${MKLROOT}/lib/intel64/libmkl_scalapack_ilp64.a -Wl,--start-group 
${MKLROOT}/lib/intel64/libmkl_cdft_core.a 
${MKLROOT}/lib/intel64/libmkl_intel_ilp64.a 
${MKLROOT}/lib/intel64/libmkl_tbb_thread.a 
${MKLROOT}/lib/intel64/libmkl_core.a 
${MKLROOT}/lib/intel64/libmkl_blacs_openmpi_ilp64.a -Wl,--end-group  -lstdc++ -lpthread -lm -ldl -o transpose.out

Сроки получены следующим образом

Sno. Время строки Cols (в секундах)

1 16384 8192 16

2 16384 32768 68

3 32768 65536 233

Тип данных: float. Пожалуйста, дайте мне знать, если есть эффективный способ транспонирования на месте или как мы можем перенести его на несколько ядер.

int main(int argc, char *argv[])
{

   unsigned long noOfScan = atol(argv[1]);

   unsigned long noOfPix = atol(argv[2]);

   size_t nEle = noOfScan * noOfPix;

   float *data = (float *)calloc(nEle, sizeof(float));
   initalizeData(data, noOfScan, noOfPix);
   //printdata(data,noOfScan,noOfPix);
   //writeDataFile((char *)data,"BeforeTranspose.img",nEle*sizeof(float));
   printf("After transpose \n\n");
   long nt = mkl_get_max_threads();
   printf("No Of threads are = %d \n", nt);
   //mkl_set_num_threads_local(nt);
   //mkl_set_num_threads(nt);
   double time1 = cpuSecond();
   mkl_simatcopy('R', 'T', noOfScan, noOfPix, 1, data, noOfPix, noOfScan);
   printf("Time elapsed is %lf \n", cpuSecond() - time1);
   memset(data, 0, nEle * sizeof(float));
   free(data);
}

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Да, эта подпрограмма не является нитьюВ случае, если вам действительно нужна эта подпрограмма, пожалуйста, отправьте запросы функций в онлайн-сервисный центр Intel - https://supporttickets.intel.com/

1 голос
/ 14 июня 2019

Ответ с форума Intel: mkl_simatcopy не поддерживает многопоточность.

...