【问题标题】:Trouble with using openmp with nested for loops and intrinsics使用带有嵌套 for 循环和内在函数的 openmp 时遇到问题
【发布时间】:2011-11-09 08:34:29
【问题描述】:

所以我在找出使用 openmp 并行化这些 for 循环的最佳方法时遇到了一些麻烦。我猜最大的加速将来自像我在这里所做的那样并行化中间循环:

for(i = 0; i < m/16*16; i+=16){
    #pragma omp parallel for
        for(j = 0; j < m; j++){

            C_column_start = C+i+j*m;

            c_1 = _mm_loadu_ps(C_column_start);
            c_2 = _mm_loadu_ps(C_column_start+4);
            c_3 = _mm_loadu_ps(C_column_start+8);
            c_4 = _mm_loadu_ps(C_column_start+12);

            for (k=0; k < n; k+=2){

                A_column_start = A+k*m;

                a_1 = _mm_loadu_ps(A_column_start+i);
                a_2 = _mm_loadu_ps(A_column_start+i+4);
                a_3 = _mm_loadu_ps(A_column_start+i+8);
                a_4 = _mm_loadu_ps(A_column_start+i+12);

                b_1 = _mm_load1_ps(A_column_start+j);

                mul_1 = _mm_mul_ps(a_1, b_1);
                mul_2 = _mm_mul_ps(a_2, b_1);
                mul_3 = _mm_mul_ps(a_3, b_1);
                mul_4 = _mm_mul_ps(a_4, b_1);

                c_4 = _mm_add_ps(c_4, mul_4);
                c_3 = _mm_add_ps(c_3, mul_3);
                c_2 = _mm_add_ps(c_2, mul_2);
                c_1 = _mm_add_ps(c_1, mul_1);

                A_column_start+=m;

                a_1 = _mm_loadu_ps(A_column_start+i);
                a_2 = _mm_loadu_ps(A_column_start+i+4);
                a_3 = _mm_loadu_ps(A_column_start+i+8);
                a_4 = _mm_loadu_ps(A_column_start+i+12);

                b_1 = _mm_load1_ps(A_column_start+j);

                mul_1 = _mm_mul_ps(a_1, b_1);
                mul_2 = _mm_mul_ps(a_2, b_1);
                mul_3 = _mm_mul_ps(a_3, b_1);
                mul_4 = _mm_mul_ps(a_4, b_1);

                c_4 = _mm_add_ps(c_4, mul_4);
                c_3 = _mm_add_ps(c_3, mul_3);
                c_2 = _mm_add_ps(c_2, mul_2);
                c_1 = _mm_add_ps(c_1, mul_1);

            }


            _mm_storeu_ps(C_column_start, c_1);
            _mm_storeu_ps(C_column_start+4, c_2);
            _mm_storeu_ps(C_column_start+8, c_3);
            _mm_storeu_ps(C_column_start+12, c_4);

        }

    }

但是,这目前几乎没有给我提速。任何提示都会很棒。我已经被困了很长一段时间了。

【问题讨论】:

  • 您是否尝试并行化外部循环?
  • 我做到了。它也没有给我任何加速。

标签: c for-loop openmp nested-loops intrinsics


【解决方案1】:

首先,您确定循环是可并行的吗? m的取值范围是多少?

当所有三个嵌套循环都可并行化并且m 足够大(例如至少16 个左右)时,并行化最外层循环 将是最有益的。并行化内部循环可能具有来自omp parallel for 的严重分叉连接开销。

对于低加速,这里有一些清单:

  1. 您确定所有内核都已使用吗?检查一种任务管理器。由于除了 omp parallel for 的隐式屏障之外没有同步,因此应该使用所有内核。
  2. m 是一个巨大的数字吗?而且,计算长度是多少?如果m 很大而计算量很小,则omp parallel for 导致的并行开销可能会抵消并行化的好处。当您并行化内部循环时,行程计数(例如,m)不应很大。
  3. False sharing 可能是一个原因。如果您的代码修改了大量内存,则可能会导致错误共享,并且可能会影响加速。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多