spmv_csr_scalar_kernel(const int num_rows,
const int * ptr,
const int * indices,
const float * data,
const float * x,
float * y )
{
int row = get_global_id(0);
if(row < num_rows)
{
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;
}
}
以上是用于将 CSR 格式的稀疏矩阵与列向量相乘的 Open Cl 代码。每个 for 循环使用一个全局工作项。任何人都可以帮助我在每个 for 循环中使用两个工作项。我是 open cl 和如果我修改即使是最小的东西也会遇到很多问题。请帮助我。这是我项目的一部分。我让它平行但我想让它更平行。如果可以的话请帮助我。plzzzz
单个工作项执行从 row_start 到 row_end 的 for 循环。我希望将此行或 for 循环进一步分为两部分,每个部分由单个工作项执行。我该如何继续完成呢?
这是我能想到的,但它返回了错误的输出。
__kernel void mykernel(__global int* colvector,
__global int* val,
__global int* result,
__global int* index,
__global int* rowptr,
__global int* sync )
{
__global int vals[8]={0,0,0,0,0,0,0,0};
for(int i=0;i<4;i++)
{
result[i]=0;
}
barrier(CLK_GLOBAL_MEM_FENCE);
int thread_id=get_global_id(0);
int warp_id=thread_id/2;
int lane=(thread_id)&1;
int row=warp_id;
if(row<4)
{
int row_start = rowptr[row];
int row_end = rowptr[row+1];
vals[thread_id]=0;
for (int i = row_start+lane; i<row_end; i+=2)
{
vals[thread_id]+=val[i]*colvector[index[i]];
}
vals[thread_id]+=vals[thread_id+1];
if(lane==0)
{
result[row] += vals[thread_id];
}
}
}