圧縮された列ストレージのスパース行列を列ベクトルで乗算する必要があります (オープン cl で並列化する必要があります)。インターネット中を検索しました。何日も費やしましたが、何も見つかりませんでした。(インターネットを検索することは許可されています)私はそれを並列に変換する必要があるため)しかし、圧縮された行ストレージのコードしか見つけることができませんでした。
spmv_csr_serial(const int num_rows ,
const int * ptr ,
const int * indices ,
const float * data ,
const float * x,
float * y)
{
for(int row = 0; i < num_rows; i++){
float dot = 0;
int row_start = ptr[row];
int row_end = ptr[row+1];
for (int jj = row_start; jj < row_end; jj++)
dot += data[jj] * x[indices[jj]];
y[row] += dot;
}
}
圧縮された列ストレージには行 ptr がありません。では、どうすればそれをベクトルで乗算できますか? シリアルコードが必要なだけで、自分でパラレルに変換します。
このプロジェクトの OpenCL カーネルは次のとおりです。
enter code here
__kernel void mykernel(__global const int* val,__global const int* index,__global const int * ptr,__global const int* x,__global int* y)
{
int id=get_global_id(0);
int colstart=ptr[id];
int colend=ptr[id+1];
for(int j=colstart;j<colend;j++)
{
y[index[j]]=val[j]*x[index[j]];
}
}
このコードは、オープン cl カーネルでガベージ値を返します。これが私のシリアルコードでした。
spmv_csr_serial(const int num_rows ,
const int * ptr ,
const int * indices ,
const float * data ,
const float * x,
float * y)
{
for(int row = 0; i < num_rows; i++){
float dot = 0;
int colstart = ptr[row];
int colend = ptr[row+1];
for(int j=colstart;j<colend;j++)
{
y[index[j]]=val[j]*x[index[j]];
}
}
}
密行列ベクトル乗算のアルゴリズム
For(int i=0;i<A.RowLength;i++)
{
For(int j=0;j<vector.length;j++)
{
Result[i]=Result[i]+A[i][j]*vector[j];
}
}