这个矩阵的尺寸为40000*40000。我原本应该考虑程序的空间和时间局部性,但我不知道如何优化这段代码。它在我的电脑上需要50多秒的时间,这对我们的团队来说是不能接受的。目前块的大小为500。有人可以帮我改进这段代码吗?
void InitializeMatrixRowwise(){
int i,j,ii,jj;
double x;
x = 0.0;
for (i = 0; i < DIMENSION; i += BLOCKSIZE)
{
for (j = 0; j < DIMENSION; j += BLOCKSIZE)
{
for (ii = i; ii < i+BLOCKSIZE && ii < DIMENSION; ii++)
{
for (jj = j; jj < j+BLOCKSIZE && jj < DIMENSION; jj++)
{
if (ii >= jj)
{
Matrix[ii][jj] = x++;
}
else
Matrix[ii][jj] = 1.0;
}
}
}
}
}
void TransposeMatrixRowwise(){
int column,row,i,j;
double temp;
for (row = 0; row < DIMENSION; row += BLOCKSIZE)
{
for (column = 0; column < DIMENSION; column += BLOCKSIZE)
{
for (i = row; i < row + BLOCKSIZE && i < DIMENSION; i++)
{
for (j = column; j < column + BLOCKSIZE && j < DIMENSION; j++)
{
if (i > j)
{
temp = Matrix[i][j];
Matrix[i][j] = Matrix[j][i];
Matrix[j][i] = temp;
}
}
}
}
}
}
double
类型,则一个大小为 40k x 40k 的矩阵大约使用 12.8 GiB 的空间,如果是float
类型的元素,则使用的空间将减半。这非常庞大;即使假设您有足够的物理内存将其全部保存在内存中,初始化这么多数据也需要时间。 - Jonathan LefflerMatrix (40000x40000, blocks 500x500)
/Initialization: 10.597134
/Transposition: 22.087354
,总共花费了将近33秒,这与您测量的结果完全相当。使用块大小子单元的代码潜在地会导致对内存的顺序访问较少,但通过其他机制获得相同的结果绝非易事。我尝试了一种方法,但产生了不同的结果。 - Jonathan Leffler