在OpenMP中为for循环指定块大小时,如果有余数,是否由编译器处理?例如,如果我使用大小为4和3的线程迭代13个点,假设使用了所有线程,其中一个将被赋予第5个点,或者我是否需要指定它?
答案 0 :(得分:1)
是的,OpenMP会为您处理。您无需指定任何内容。
我假设你在这里讨论静态调度,因为动态调度看起来很明显。
例如来自Intel doc静态调度
将循环划分为相等大小的块或尽可能相等 循环迭代次数不能被整除的情况 线程数乘以块大小。
根据实施情况划分剩余的块。
如果您想了解更多详情,请参阅MSDN doc
对于一组p线程,让ceiling(n / p)为整数q,即 满足n = p * q -r,其中0 <= r <1。页。一个实现的 此示例的静态调度将q迭代分配给 第一个p-1线程,以及到最后一个线程的q-r迭代。另一个 可接受的实现将q迭代分配给第一个p-r 线程,以及对剩余r个线程的q-1次迭代。这个 说明了为什么程序不应该依赖于a的细节 具体实施。