我是OpenMP的新手。当我使用
并行化for
循环时
#pragma omp parallel for num_threads(4)
for(i=0;i<4;i++){
//some parallelizable code
}
是否保证每个线程只采用一个且i
的值?当num_threads
不等于或不均匀分配for循环的总次数时,循环如何在线程之间进行划分?是否有一个命令可用于指定每个线程只使用一个i
值,或者每个线程的i
值是多少?
答案 0 :(得分:4)
循环结构中的工作分区由 schedule 决定。如果不存在schedule
子句,则使用 def-sched-var 调度,这是实现定义的。
您可以使用schedule (static, 1)
,在您的情况下,保证每个线程只能获得一个值。
我强烈建议您查看OpenMP specification,表2.5和2.7.1.1。
进行这种假设可能有合理的理由,但一般来说,循环代码的正确性不应该依赖于此。主要是我会把它当作表现提示。
根据您的用例,您可能需要考虑任务或仅考虑并行结构。如果您依赖这些循环细节,请确保它在标准中已明确指定,而不是在您的特定实现中正常工作。