矩阵乘法?

时间:2011-05-18 10:03:34

标签: c# optimization matrix

我在这里尝试的是两个500x500双打矩阵的乘法运算。 我得到空引用异常!

你可以看一下吗

void Topt(double[][] A, double[][] B, double[][] C) {
    var source = Enumerable.Range(0, N);
    var pquery = from num in source.AsParallel()
                    select num;
    pquery.ForAll((e) => Popt(A, B, C, e));
}

void Popt(double[][] A, double[][] B, double[][] C, int i) {
    double[] iRowA = A[i];
    double[] iRowC = C[i];
    for (int k = 0; k < N; k++) {
        double[] kRowB = B[k];
        double ikA = iRowA[k];
        for (int j = 0; j < N; j++) {
            iRowC[j] += ikA * kRowB[j];
        }
    }
}

提前致谢

1 个答案:

答案 0 :(得分:1)

由于你的nullpointer问题已经解决,为什么不是一个小的性能提示;)你可以尝试的一件事是缓存遗忘算法。对于2k x 2k矩阵,我得到24.7秒用于递归缓存无关变体和50.26s用简单迭代方法在e8400 @ 3ghz单线程C中(两者都可以明显进一步优化,一些更好的参数用于编译器并确保SSE使用等)。虽然500x500非常小,所以你必须尝试,如果这给你带来明显的改善。

递归的通常更容易制作多线程。

哦,但是最重要的是因为你在c#中写道:阅读this - 它适用于java,但同样适用于任何现代JIT ..

相关问题