Я хочу, чтобы на месте транспонировалась память очень большой матрицы. Я использую 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);
}