gpt4 book ai didi

c++ - MKL 矩形矩阵就地转置 : not using multiple cores?

转载 作者:太空宇宙 更新时间:2023-11-04 07:47:18 25 4
gpt4 key购买 nike

我想要一个非常大的矩阵的就地内存转置。我正在使用 mkl_simatcopy。但是我在就地转置时观察到一些性能问题。我目前正在使用具有 72 个物理内核和 RedHat 操作系统的 Intel(R) Xeon(R) CPU E7-8867 v4 @ 2.40GHz。

我的观察是,当我执行转置操作时,只使用了单个内核,并没有使用所有内核。 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

得到的时间如下

斯诺。行列时间(以秒为单位)

1 16384 8192 16

2 16384 32768 68

3 32768 65536 233

数据类型为浮点型。如果有一种有效的原地转置方法或我们如何将其移植到多个内核,请告诉我。

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

最佳答案

answer来自英特尔论坛:mkl_simatcopy 不支持多线程。

关于c++ - MKL 矩形矩阵就地转置 : not using multiple cores?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56109574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com