我正在处理两个矩阵求和函数,一个有线程,一个没有。我将矩阵(一个 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/