【发布时间】:2012-08-25 23:55:14
【问题描述】:
这是我为并行计算一些数组而启动的内核。
__device__ bool mult(int colsize,int rowsize,int *Aj,int *Bi)
{
for(int j = 0; j < rowsize;j++)
{
for(int k = 0;k < colsize;k++)
{
if(Aj[j] == Bi[k])
{
return true;
}
}
}
return false;
}
__global__ void kernel(int *Aptr,int *Aj,int *Bptr,int *Bi,int rows,int cols,int *Cjc)
{
int tid = threadIdx.x + blockIdx.x * blockDim.x;
int i;
if(tid < cols)
{
int beg = Bptr[tid];
int end = Bptr[tid+1];
for(i = 0;i < rows;i++)
{
int cbeg = Aptr[i];
int cend = Aptr[i+1];
if(mult(end - beg,cend - cbeg,Aj+cbeg,Bi+beg))
{
Cjc[tid+1] += 1;
//atomicAdd(Cjc+tid+1,1);
}
}
}
}
我的启动配置和内核调用如下。
int numBlocks,numThreads;
if(q % 32 == 0)
{
numBlocks = q/32;
numThreads = 32;
}
else
{
numBlocks = (q+31)/32;
numThreads = 32;
}
findkernel<<<numBlocks,numThreads>>>(devAptr,devAcol,devBjc,devBir,m,q,d_Cjc);
我不得不承认,这个内核运行得很慢。一旦我将阵列返回到主机端,我使用thrust::inclusive_scan 来查找我的结果阵列。
我的问题是,我的内核是否还有改进/优化的空间?我尝试使用共享内存,但它会产生错误的答案或引发运行时异常。
另外,动态分配的共享内存(由内核启动中的第三个参数分配)是如何在块之间分配的?
任何帮助/提示/暗示将不胜感激。 提前致谢。
【问题讨论】:
-
你能简单地解释一下你的代码打算做什么吗?那么我们就有更好的机会帮助您进行优化
-
@asm...试图在两个稀疏矩阵相乘中找到结果稀疏矩阵的 JC 数组....
-
好吧,你实现了像matlab JC数组一样的东西..我会尝试提出一些想法
-
@asm..我有一个
CSR的矩阵和另一个CSC格式的矩阵...所以我必须检查结果列是否有非零.. .我通过将每列B矩阵与A矩阵的所有行相乘来做到这一点(***假设操作为C = A * B***)...如果有非零,我将在每个位置加1结果Cjc数组,这样在主机端thrust::inclusive_scan之后,我将拥有我想要的正确 JC 数组....