【问题标题】:optimized static padding for strassen's odd matrices斯特拉森奇数矩阵的优化静态填充
【发布时间】:2012-03-28 13:50:17
【问题描述】:

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

我在实现这一点时遇到了一些麻烦 - 主要是因为我不确定什么是最有效的。我需要遍历所有可能的 m 值,还是从每个给定的输入递增,测试它们是否满足条件?

【问题讨论】:

    标签: c algorithm strassen


    【解决方案1】:

    你是对的。填充到 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);
        }
    }
    

    【讨论】:

    • 对于actual_size = 258,Q = 17,这是返回256,我认为这是不正确的。我希望它填充到 272。问题是当你除以 2 得到一个奇数时,但在你达到阈值之前。
    • 你是对的。我之前的解决方案是错误的。我已经纠正了。现在 actual_size = 258 和 Q=17 返回值为 272 :)
    【解决方案2】:

    以上述为灵感,我相信已经找到了一种更简洁的算法来寻找最小填充

    它的工作原理是重复使数字可被 2 整除,直到低于阈值,然后将其乘以 2**counter 以获得矩阵必须填充到的大小,以便重复被 2 整除,直到它小于阈值

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

    【讨论】:

    • 注意 inSIze++ 可以替换为 if (inSize % 2) inSize++;然而,由于偶数加 1 整数除法 / 2 等于它自己,所以总是加一是无害的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2019-01-13
    • 2012-12-04
    • 2014-05-13
    • 1970-01-01
    相关资源
    最近更新 更多