4800x9600 マトリックスの行を一緒に追加しようとすると、マトリックス 1x9600 になります。
私が行ったことは、4800x9600 をそれぞれ長さ 4800 の 9,600 の行列に分割することです。次に、4800 要素に対して削減を実行します。
問題は、これが本当に遅いことです...
誰にも何か提案がありますか?
基本的に、MATLAB の sum(...) 関数を実装しようとしています。
これは私が正常に動作することを確認したコードです。それは本当に遅いだけです:
void reduceRows(Matrix Dresult,Matrix DA)
{
//split DA into chunks
Matrix Dchunk;
Dchunk.h=1;Dchunk.w=DA.h;
cudaMalloc((void**)&Dchunk.data,Dchunk.h*Dchunk.w*sizeof(float));
Matrix DcolSum;
DcolSum.h=1;DcolSum.w=1;
//cudaMalloc((void**)&DcolSum.data,DcolSum.h*DcolSum.w*sizeof(float));
int i;
for(i=0;i<DA.w;i++) //loop over each column
{
//printf("%d ",i);
cudaMemcpy(Dchunk.data,&DA.data[i*DA.h],DA.h*sizeof(float),cudaMemcpyDeviceToDevice);
DcolSum.data=&Dresult.data[i];
reduceTotal(DcolSum,Dchunk);
}
cudaFree(Dchunk.data);
}
行列は次のように定義されます。
typedef struct{
long w;
long h;
float* data;
}Matrix;
ReduceTotal() は、標準の NVIDIA リダクションを呼び出すだけで、Dchunk のすべての要素を合計し、その答えを DcolSum に入れます。
答えが見つからない場合は、CPUでこれをすべて実行しようとしています... ;(
よろしくお願いします。