c++ - MKL 矩形矩阵就地转置:不使用多核?
问题描述
我想要一个非常大的矩阵的就地内存转置。我正在使用 mkl_simatcopy。但是我在就地转置时观察到一些性能问题。我目前正在使用 Intel(R) Xeon(R) CPU E7-8867 v4 @ 2.40GHz,具有 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
得到的时序如下
斯诺。行列时间(秒)
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);
}
解决方案
英特尔论坛的答案mkl_simatcopy
:不支持多线程。
推荐阅读
- html - 无法绑定到“配置”,因为它不是“ng-material-multilevel-menu”的已知属性
- sql - 当我的 sql 查询必须通过表中的两个元素进行选择时,如何在 rest api 上纠正 app.get 函数中的路径?
- xml - 当 XML 子元素包含命名空间时更正 XPath 语法
- php - 无法识别 ObjectManager(声明必须与 FixtureInterface->load 兼容)
- mysql - 引起:org.springframework.dao.IncorrectResultSizeDataAccessException:查询没有返回唯一结果:3
- php - 检查令牌是否有效
- flutter - 在 Flutter 中重置收音机列表
- python - 使用python从链接地址下载文件
- maven - 如何通过 Maven 仅复制特定于操作系统的依赖 jar?
- javascript - 是否可以在不需要打开相应文件的情况下获得 jsdoc 提示?