我弄乱了两个矩阵求和函数,一个是线程,另一个没有。我将矩阵(一个三维矩阵,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用于非线程。你们可以给予的任何建议都会非常感激,试图了解线程的好处。
答案 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;
}