主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

简化数组索引中的乘法运算

生成的代码在索引数组元素时可能会有多次操作。您可以选择优化参数简化数组索引,用临时变量替换数组索引中的乘法运算。这种优化可以通过减少乘法运算的执行次数来提高执行速度。

示例模型

假如您有以下模型:

Constant 模块具有以下常量值

  • Const1: reshape(1:120,[1 2 3 4 5])

  • Const2: reshape(1:120,[1 2 3 4 5])

  • Const3: reshape(1:120,[1 2 3 4 5])

Concatenate 模块参数模式设置为多维数组Constant 模块采样时间参数设置为 –1

生成代码

在关闭简化数组索引参数的情况下构建模型会生成以下代码:

  real_T pooled1;
  int32_T Out1_tmp;
  int32_T Out1_tmp_0;
  int32_T i;
  int32_T i_0;
  int32_T i_1;
  int32_T pooled1_tmp;
  int32_T pooled1_tmp_0;

  for (i_1 = 0; i_1 < 5; i_1++) {
    for (i_0 = 0; i_0 < 4; i_0++) {
      for (i = 0; i < 3; i++) {
        pooled1_tmp = i << 1;
        pooled1_tmp_0 = (6 * i_0 + pooled1_tmp) + 24 * i_1;
        pooled1 = ex_arrayindex_ConstP.pooled1[pooled1_tmp_0];
        pooled1_tmp = (18 * i_0 + pooled1_tmp) + 72 * i_1;
        ex_arrayindex_Y.Out1[pooled1_tmp] = pooled1;

        Out1_tmp = (((i + 3) << 1) + 18 * i_0) + 72 * i_1;
        ex_arrayindex_Y.Out1[Out1_tmp] = pooled1;

        Out1_tmp_0 = (((i + 6) << 1) + 18 * i_0) + 72 * i_1;
        ex_arrayindex_Y.Out1[Out1_tmp_0] = pooled1;

        pooled1 = ex_arrayindex_ConstP.pooled1[pooled1_tmp_0 + 1];
        ex_arrayindex_Y.Out1[pooled1_tmp + 1] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 1] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp_0 + 1] = pooled1;
      }
    }
  }

生成优化代码

打开配置参数对话框并选择简化数组索引参数。再次编译模型。在生成的代码中,(tmp_3 + tmp_2) + tmp_0 替换了数组索引中的乘法运算。现在生成的代码是:

  real_T pooled1;
  int32_T Out1_tmp;
  int32_T i;
  int32_T i_0;
  int32_T i_1;
  int32_T pooled1_tmp;
  int32_T tmp;
  int32_T tmp_0;
  int32_T tmp_1;
  int32_T tmp_2;
  int32_T tmp_3;

  tmp = 0;
  tmp_0 = 0;
  for (i_1 = 0; i_1 < 5; i_1++) {
    tmp_1 = 0;
    tmp_2 = 0;
    for (i_0 = 0; i_0 < 4; i_0++) {
      tmp_3 = 0;
      for (i = 0; i < 3; i++) {
        pooled1_tmp = (tmp_3 + tmp_1) + tmp;
        pooled1 = ex_arrayindex_ConstP.pooled1[pooled1_tmp];
        Out1_tmp = (tmp_3 + tmp_2) + tmp_0;
        ex_arrayindex_Y.Out1[Out1_tmp] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 6] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 12] = pooled1;
        pooled1 = ex_arrayindex_ConstP.pooled1[pooled1_tmp + 1];
        ex_arrayindex_Y.Out1[Out1_tmp + 1] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 7] = pooled1;
        ex_arrayindex_Y.Out1[Out1_tmp + 13] = pooled1;
        tmp_3 += 2;
      }

      tmp_1 += 6;
      tmp_2 += 18;
    }

    tmp += 24;
    tmp_0 += 72;
  }

另请参阅

主题