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

标签 c++ multithreading

我正在处理两个矩阵求和函数,一个有线程,一个没有。我将矩阵(一个 3 维矩阵,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。非常感谢你们能提供的任何建议,尝试了解线程的好处。

最佳答案

在您的例子中,每个 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;
}

关于c++ - 返回不同值的两个矩阵求和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33313053/

相关文章:

c++ - 定义枚举后赋值

java - 如何确保文件仅由 Java 中的多线程从磁盘加载一次

c - 在所有生产者都结束之后,如何正确终止多个消费者?

java - 方法减慢执行 paintComponent()

c - 在 C Linux 上使用线程的错误分段违规核心

c++ - GoogleTest 无法使用自定义比较运算符

c++ - 使用 malloc 在 C++ 中动态分配结构

c++ - 为什么使用 'if' 语句可以提供更好的性能?

c++ - 判断一个抽象基类的构造函数是否为noexcept?

ruby - 同时下载多个文件(多线程)