为strassen的奇数矩阵优化静态填充

时间:2012-03-28 13:50:18

标签: c algorithm strassen

我正在尝试解决strassen算法的奇数矩阵问题。我的实现在某一点截断递归,称之为Q,并切换到标准实现。因此,在进行静态填充时,实际上我不需要填充到2的下一个幂。我只需要填充到比输入矩阵维度大至少m * 2 ^ k,使得m <1。 Q值。

我在实现这个方面遇到了一些麻烦 - 主要是因为我不确定什么是最有效的。我是否需要遍历所有可能的m值,或者我是否从每个给定的输入增加,测试它们是否符合标准?

2 个答案:

答案 0 :(得分:0)

你是对的。填充高达m * 2 ^ k应该比填充到下一次2的幂要好得多。

我认为你应该填补这个函数计算的值:

int get_best_pud_up_value(int actual_size, int Q) {
    int cnt = 0;
    int n = actual_size;
    while(n > Q) {
        cnt++;
        n /= 2;
    }

    // result should be smallest value such that:
    // result >= actual_size AND
    // result % (1<<cnt) == 0

    if (actual_size % (1<<cnt) == 0) {
        return actual_size;
    } else {
        return actual_size + (1<<cnt) - actual_size % (1<<cnt);
    }
}

答案 1 :(得分:0)

使用以上作为灵感,我相信找到了一个更简洁的算法来找到最小填充

它的工作原理是重复地将数字除以2,直到它低于阈值,然后乘以2 **计数器得到矩阵必须填充的大小,以便重复被2整除,直到它为止小于门槛

unsigned int minPad(unsigned int inSize, unsigned int threshold) {
    unsigned int counter = 0;
    while (inSize > threshold) {
        inSize++;
        inSize >>= 1;
        counter ++;
    }
    return inSize << counter;
}