2011-11-29 49 views
2

我想执行一些应用程序平行使用sse指令和openmp。 关于的openmp部分我有这样的代码:OpenMP划分循环通过核心

for(r=0; r<end_condition; r++){ 
    .. several nested for loops inside .. 
} 

我想要分割该环R上在多个核,例如使用两个核心当一个核心应该执行使r = 0 .. R = end_condition/2 -1,另一个r = end_condition/2 .. r = end_condition-1。循环迭代之间没有任何通信,所以它们可以并行运行,在循环结束时应该同步结果。

我怎样才能使用openmp指令以这种方式在内核上分配这个内核呢?我是否必须在r上展开循环并使用openmp部分?

在此先感谢

回答

1

您可以通过添加实现这一点:

#pragma omp parallel for 
for(r=0; r<end_condition; r++){ 
    .. several nested for loops inside .. 
} 

你需要知道什么是共享的,什么是你的私人循环,虽然。虽然这并不能保证你按照你提到的那样划分了r。如果你想以这种明确的方式拥有它,你可以使用任务。但手工做这件事并不方便,我不能推荐它。

0

您可以设置for循环应创建的线程数。对于每个线程,您可以指定块大小。

1

以下代码编译器生成一个并行区域,由N个线程执行。

omp_set_num_threads(N); 

#pragma omp parallel for 
for(int r = 0; r < end_condition; ++r) 
{ 
    .. several nested for loops inside .. 
} 

每个线程都从end_condition执行子集。请注意,您的计数变量r现在在范围内的omp parallel内声明。现在每个线程都有自己的计数变量。

同一个目标可以使用并行编译,而不是并行的实现,就像这样:

omp_set_num_threads(N); 
#pragma omp parallel private(r) 
{ 
    int tid = omp_get_thread_num(); 
    for(r = (end_condition/N) * tid; r < (end_condition/N) * (tid+1) ; ++r) 
    { 
    .. several nested for loops inside .. 
    } 
} 
当然,只有当end_condition%N = 0的

,但你得到前人的精力交易。这里变量r显式标记为线程私有,可以声明为你想要的。编译器将为每个线程生成一个副本。

+0

通过告诉OpenMP为循环使用静态计划可能会鼓励分解,但这可能不会有帮助。 – Novelocrat

0

我只能补充一点,如果循环的不同迭代采取不同的时间,你可能遇到的问题 - 在这种情况下你要添加schedule (dynamic)

#pragma omp parallel for schedule (dynamic) 
for(r=0; r<end_condition; r++){ 
    .. several nested for loops inside .. 
} 

另外,注意障碍是在自动添加所以你可以肯定只有当所有的迭代完成时才继续执行。如果不需要这样做(你需要做一些其他的工作与循环并行) - 在for指令参数中加nowait。然后您可以请求与#pragma omp barrier同步。