我将Nx x Ny
矩阵U
存储为长度为Nx*Ny
的一维数组。在应用方面,每个条目代表网格点(x_i, y_j)
处某些微分方程的解决方案值,尽管我并不认为这很重要。
我对C不是很熟练,但我知道它是行主要的,所以为了避免过多的缓存未命中,最好首先遍历列:
#define U(i,j) U[j+Ny*i]
for (int i=0; i<Nx; ++i)
for (int j=0; j<Ny; ++j)
U(i,j) = i*j; // example operation
我的算法要求我做两种不同类型的操作:
i
的行U
,执行一些计算,输出另一个数组i
的行F
j
的列U
,执行一些计算,输出另一个数组j
G
醇>
其中F
和G
具有相同的长度和&#34;形状&#34;为U
。目标是这样的计算步骤:
#define U(i,j) U[j+Ny*i]
#define F(i,j) F[j+Ny*i]
#define G(i,j) G[j+Ny*i]
for (int i; i<Nx; ++i)
/* use U(i,:) to compute F(i,:); the : is just pseudocode short-hand to indicate an entire column or row */
for (int j; j<Ny; ++j)
/* use U(:,j) to compute G(:,j) */
for (int i=0; i<Nx; ++i)
for (int j=0; j<Ny; ++j)
U(i,j) += F(i,j) + G(i,j); // example computation
我正在努力学习如何有效地进行这种计算。对U
行进行操作的步骤似乎很好,但是U
列上的操作将非常慢,并且以列方式将值输入G
也将慢一点。
我想到的一种方法涉及同时存储U
及其转置,这样U
列上的操作可以在UT
行上完成。但我必须进行数千次计算步骤,而且显然计算转置会更慢。同样,我可以组装G
的转置,以便我只能以行主要方式输入值,但是在步骤U(i,j) += F(i,j) + G(j,i)
中,我现在必须得到列 - 明智的G
值。
我应该如何有效地处理这种情况?