[英]Parallelize Nested Loops using OpenMP
我尝试使用 OpenMP 并行化嵌套循环,但我不确定这是否是正确的方法。 这是具有嵌套循环的代码部分。 这只是一个通用代码。 我给 noofrecords 为 50k,即使在并行化之后也需要很多时间。 有人可以提出更好的想法来并行化代码。 我只是在下面的代码中并行化外循环。
int ctd=0;
#pragma omp parallel for default(none), private(j,k,l), shared(A,B,C,D,ctd)
for(int j=0; j <noofrecords; j++)
{
for( int k=0; k<noofrecords; k++)
{
for( int l=0; l<noofrecords; l++)
{
if(condition)
{
D[ctd].a1=A[i].a1;
ctd++;
}}}}
您可以使用 collapse 子句,在您的情况下,您有 3 个连续的 for 循环,因此类似于:#pragma omp parallel for default(none), private(j,k,l), shared(A,B,C, D,ctd)崩溃(3)
如果 for 循环是连续的并且代码在最内层循环中(在您发布的代码中就是这种情况),它将起作用。 noofrecords 比您的最大线程数大得多,加速不会令人印象深刻。 如果即使并行也很慢,则可能意味着瓶颈不是您的处理能力(更可能是内存已经在 100% 下工作)。
另外,我不太确定你真的想要那个 private(j,k,l)...
D.a1
类型的a1
临时数组,其元素数等于ctd
预期最大值。a1
的临时数组a2
。a2
,用ctd2
统计a2的大小a2
按顺序填充数组a1
并将ctd2
添加到ctd
像这样的东西
int ctd=0;
double *a1 = malloc(sizeof *a1 * N); //Step 1
#pragma omp parallel
{
int ctd2 = 0;
double *a2 = malloc(sizeof *a2 * N); //step 2
#pragma omp for nowait
for(int j=0; j<noofrecords; j++)
for(int k=0; k<noofrecords; k++)
for(int l=0; l<noofrecords; l++)
if(condition) a2[ctd2++] = A[i].a1; //step 3
#pragma omp for schedule(static) ordered
for(int i=0; i<omp_get_num_threads(); i++)
#pragma omp ordered
memcpy(&a1[ctd], a2, sizeof *a1 * ctd2), ctd += ctd2; //step 4
#pragma omp for
for(int j=0; j<ctd; j++) D[j].a1 = a1[j]; // step 5
free(a2);
}
free(a1);
N
应该是您期望 ctd 具有的最大大小。 这种方法的一个内存效率低下是a2
也分配了大小N
,这可能太大了。 像 C++ 中的std::vector
或 glib 中的GArray
这样的动态向量会更有效地使用内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.