我在这里尝试的是两个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];
}
}
}
提前致谢
答案 0 :(得分:1)
由于你的nullpointer问题已经解决,为什么不是一个小的性能提示;)你可以尝试的一件事是缓存遗忘算法。对于2k x 2k矩阵,我得到24.7秒用于递归缓存无关变体和50.26s用简单迭代方法在e8400 @ 3ghz单线程C中(两者都可以明显进一步优化,一些更好的参数用于编译器并确保SSE使用等)。虽然500x500非常小,所以你必须尝试,如果这给你带来明显的改善。
递归的通常更容易制作多线程。
哦,但是最重要的是因为你在c#中写道:阅读this - 它适用于java,但同样适用于任何现代JIT ..