This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好!
我使用6678 , omp 1.1
我有两个问题,分别是关于6678 openmp库对OpenMP嵌套特性(nest)以及动态改变线程数量特性(dynamic)的支持问题。
1. 关于嵌套
omp库是否真正实现了对线程嵌套的支持? 我运行如下代码:
{ #pragma omp parallel for for(i = 0; i > 3;i++) { printf("core%d outer\n",omp_get_thread_num()); #pragma omp parallel for for(j = 0; j < 3;j++) printf("core%d inner\n",omp_get_thread_num()); }
加载在0到2核上运行的结果如下:
[C66xx_0]core0 outer core0 inner core0 inner core0 inner [C66xx_1]core1 outer [C66xx_2]core2 outer [C66xx_1]core0 inner [C66xx_2]core0 inner [C66xx_1]core0 inner [C66xx_2]core0 inner [C66xx_1]core0 inner [C66xx_2]core0 inner
从运行结果看到,在核1和核2上的内层嵌套执行时,获取的线程号是0,而不是分别为1和2。这是为什么?omp库对嵌套的支持是实现了在bios task中嵌套生成新task并完成同一核上的task调度,还是并没有实际实现真正的线程嵌套,只是将嵌套的部分以串行加载的方式在了一个核的同一个task上?
2.关于动态更改线程数量(dynamic特性)
OpenMP标准中的dynamic特性支持运行时动态的调整执行并行域的线程数量。在omp库中使用gomp_resolve_thread_num来实现线程数量的调整。gomp_resolve_thread_num中调用Multiproc_getNumOfProcsInCluster(),并以此函数的返回值作为调整后的线程数量。该函数返回一个cluster中的核数,我查看手册说,默认情况下一个系统只有一个cluster,那么也就是说一个6678板一个cluster,那么这个函数返回的值是当前运行中的核数?还是什么值?它难道不是一个对于一次运行来说固定的值吗?它为什么会随我更改omp_set_num_threads()所设定的值而改变(Openmp标准中规定dynamic调整的线程数不能大于omp_set_num_threads所设定的值,但我感觉Multiproc_getNumOfProcsInCluster()是一个相对固定值)?
请大家帮忙解答!
谢谢!