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 OpenMP中的nest和dynamic特性的问题

大家好!

我使用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()是一个相对固定值)?

请大家帮忙解答!

谢谢!