两个矩阵求和函数返回不同的值

时间:2015-10-23 23:55:08

标签: c++ multithreading

我弄乱了两个矩阵求和函数,一个是线程,另一个没有。我将矩阵(一个三维矩阵,1000 x 1000 x 1000)分成两个线程,这样矩阵的一半被求和,而另一半被求和,然后我加上这两个一起。这是线程函数,它将矩阵的维度作为参数,并且只对这些维度中的值求和。

另一个函数对矩阵进行求和而不将其分割,它会遍历所有十亿个值。

这是线程函数:

long double myFunction(double*** a3DArray, int dimLower, int dimUpper){
    long double aValue = 0.0;
    for (int i = dimLower; i < dimUpper; i++) {
        for (int j = dimLower; j < dimUpper; j++) {
            for(int k = dimLower; k < dimUpper; k++) {
                aValue += a3DArray[i][j][k];
            }
        }
    }

    return aValue;
}

我相信我已经正确地写了它,但这就是为什么我在这里,看看有人看到任何明显我无法做到的事情。

这是非线程的:

long double sumArray(double*** a3DArray, int m, int n, int l) {
       long double sum = 0.0;
       int i, j, k;
       for (i = 0; i<m; i++) {
           for (j = 0; j<n; j++) {
               for(k = 0; k<l; k++) {
                   sum += a3DArray[i][j][k];
               }
           }
       }
       return sum;
    }

这是main

int main(){
    int dim = 1000;
    double ***my3DArray = new double**[dim];
    for (int i = 0; i<dim; i++) {
        my3DArray[i] = new double*[dim];
        for(int j=0; j<dim; j++) {
            my3DArray[i][j] = new double[dim];
            for (int k=0; k<dim; k++) {
                my3DArray[i][j][k] = 2.3;
            }
        }
    }
    auto thread1 = std::async(myFunction, my3DArray, 0, 500);
    long double myOutput = thread1.get();
    auto thread2 = std::async(myFunction, my3DArray, 500, 1000);
    myOutput += thread2.get();
    long double ThreeDArraySum = sumArray(my3DArray, 1000, 1000, 1000);
}

main中,我构建矩阵,每个值为2.3,我调用两个函数,前两个线程将矩阵分成两半,然后只是标准求和。

虽然我得到了不同的价值,但由于求和函数或线程的创建,我不确定它是否存在。我有正确的#includes和一切,我得到9e + 08用于线程计算,2.3e + 09用于非线程。你们可以给予的任何建议都会非常感激,试图了解线程的好处。

1 个答案:

答案 0 :(得分:0)

在您的情况下,每个myFunction调用使用500*500*500个元素。总共使用了2*500*500*500 = 250*10^6,同时您的3d数组有1000*1000*1000 = 1000*10^6个元素。您的myFunction必须如下所示:

long double myFunction(double*** a3DArray, int dimLower, int dimUpper, int matrixSize) {
    long double aValue = 0.0;
    for (int i = dimLower; i < dimUpper; i++) {
        for (int j = 0; j < matrixSize; j++) {
            for(int k = 0; k < matrixSize; k++) {
                aValue += a3DArray[i][j][k];
            }
        }
    }

    return aValue;
}