多线程 – 从openmp并行区域调用多线程MKL
发布时间:2020-12-15 04:16:29 所属栏目:Java 来源:网络整理
导读:我有一个具有以下结构的代码 #pragma omp parallel{ #omp for nowait { // first for loop } #omp for nowait { // first for loop } #pragma barrier -- #pragma omp single/critical/atomic -- not sure dgemm_(....) #pragma omp for { // yet another fo
我有一个具有以下结构的代码
#pragma omp parallel { #omp for nowait { // first for loop } #omp for nowait { // first for loop } #pragma barrier <-- #pragma omp single/critical/atomic --> not sure dgemm_(....) #pragma omp for { // yet another for loop } } 对于dgemm_,我链接多线程mkl.我希望mkl使用所有可用的8个线程.这样做的最佳方法是什么? 解决方法
这是嵌套并行性的一种情况.它受MKL支持,但仅当您的可执行文件是使用Intel C/C++编译器构建时才有效.这种限制的原因是MKL使用Intel的OpenMP运行时,并且不同的OMP运行时彼此不能很好地运行.
一旦整理完毕,您应该通过将OMP_NESTED设置为TRUE来启用嵌套并行性,并通过将MKL_DYNAMIC设置为FALSE来禁用MKL检测嵌套并行性.如果要共享要与dgemm_进行处理的数据,则必须在单个构造中调用后者.如果每个线程处理自己的私有数据,那么您不需要任何同步构造,但使用多线程MKL也不会给您带来任何好处.因此,我认为你的案子是前者. 总结一下: #pragma omp single dgemm_(...); 并运行: $MKL_DYNAMIC=FALSE MKL_NUM_THREADS=8 OMP_NUM_THREADS=8 OMP_NESTED=TRUE ./exe 您还可以使用适当的调用设置参数: mkl_set_dynamic(0); mkl_set_num_threads(8); omp_set_nested(1); #pragma omp parallel num_threads(8) ... { ... } 虽然我更愿意使用环境变量. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读