私はアルゴリズムの速度を上げようとしています。そのため、iOS用の「Instruments」でアプリケーションを実行しました。その結果、ほぼ75%の時間が計算をベクター。ベクトルのアクセス時間を短縮する方法
誰もがCPUの量を消費せずにデータを保存する良い方法を知っていますか?私は、キャッシュメモリやそのようなものへのアクセスに関連していると思います。行にはコメントがついています。この行には、短絡配列で短い行が保存されています。
short XY[32*32*2]
Mat _XY(bh, bw, CV_16SC2, XY), matA;
Mat dpart(dst, Rect(x, y, bw, bh));
for(y1 = 0; y1 < bh; y1++)
{
short* xy = XY + y1*bw*2;
int X0 = M[0]*x + M[1]*(y + y1) + M[2];
int Y0 = M[3]*x + M[4]*(y + y1) + M[5];
float W0 = M[6]*x + M[7]*(y + y1) + M[8];
M2[2] = X0;
M2[3] = Y0;
for(x1=0; x1<bw; x1++)
{
float W = W0 + M[6]*x1;
W = 1./W;
float x12[2] = {x1*W,W};
matvec2_c(M2,x12,M3);
short aux = (M3[0]);
int aux2 = x1*2;
xy[aux2] = aux; // %60 CPU TIME
xy[x1*2+1] = (M3[1]); // 11% CPU TIME
}
// ...
}
void matvec2_c(float m[4], float v[2], float d[2])
{
d[0] = m[0]*v[0] + m[2]*v[1];
d[1] = m[1]*v[0] + m[3]*v[1];
}
あなたは 'xy'に線形順番でアクセスしています。あなたはキャッシュの視点からそれをはるかに上回ることはできません! 'matvec2_c'の複雑さは何ですか?それは行列 - ベクトル乗算のように聞こえる。もしそうなら、私はあなたが記憶に縛られていると信じるのに苦労します。 –
'short * xy = XY + y1 * bw * 2;'はちょっと変わったようです。そこにメモリオフセットを計算していますか? – Bort
多分行と列のアライメントはCではなくFortran形式ですか?私は、あなたのマトリックスタイプについてのより多くの情報が必要だと思います。 – Bort