E. OpenMP C/C++ 中实现定义的行为

本附录总结了此 API 中描述为“实现定义”的行为。 每个行为都会交叉引用回其在主规范中的描述。

注解

在这些情况下,需要实现来定义和记录其行为,但此列表可能不完整。

  • 线程数:如果在禁用线程数的动态调整时遇到并行区域,并且为并行区域请求的线程数大于运行时系统可以提供的线程数,则程序的行为是实现定义的(请参阅第 9 页)。

    在 Visual C++ 中,对于非嵌套并行区域,将提供 64 个线程(最大值)。

  • 处理器数:在任何给定时间实际承载线程的物理处理器数是实现定义的(参见第 10 页)。

    在 Visual C++ 中,此数字不是恒定的,由操作系统控制。

  • 创建线程团队:团队中执行嵌套并行区域的线程数是实现定义的(请参阅第 10 页)。

    在 Visual C++ 中,此数字由操作系统确定。

  • 计划(运行时):有关计划的决定将推迟到运行时。 通过设置 OMP_SCHEDULE 环境变量,可以在运行时选择计划类型和块大小。 如果未设置此环境变量,则生成的计划是实现定义的(请参阅第 13 页)。

    在 Visual C++ 中,计划类型为 static,没有块大小。

  • 默认计划:在没有计划子句的情况下,默认计划是实现定义的(参见第 13 页)。

    在 Visual C++ 中,默认计划类型为 static,没有块大小。

  • 原子:实现是否将所有 atomic 指令替换为具有相同唯一名称的 critical 指令是实现定义的(参见第20页)。

    在 Visual C++ 中,如果由原子修改的数据不是自然对齐,或者长度为一两个字节,则满足该属性的所有原子操作都将使用一个关键部分。 否则,将不会使用关键部分。

  • omp_get_num_threads如果用户未显式设置线程数,则默认值为实现定义的(请参阅第 9 页)。

    在 Visual C++ 中,默认线程数等于处理器数。

  • omp_set_dynamic动态线程调整的默认值为实现定义的。

    在 Visual C++ 中,默认值为 FALSE

  • omp_set_nested启用嵌套并行性时,用于执行嵌套并行区域的线程数是实现定义的。

    在 Visual C++ 中,线程数由操作系统确定。

  • OMP_SCHEDULE 环境变量:此环境变量的默认值为实现定义。

    在 Visual C++ 中,计划类型为 static,没有块大小。

  • OMP_NUM_THREADS 环境变量:如果没有为 OMP_NUM_THREADS 环境变量指定任何值,或者指定的值不是正整数,或者如果该值大于系统可以支持的最大线程数,则要使用的线程数是实现定义的。

    在 Visual C++ 中,如果指定的值为零或更小,则线程数等于处理器数。 如果值大于 64,则线程数为 64。

  • OMP_DYNAMIC 环境变量:默认值是实现定义的。

    在 Visual C++ 中,默认值为 FALSE