这里是我启动的并行计算某个数组的内核。Cuda内核产生的结果向量为零
__device__ bool mult(int colsize,int rowsize,int *Aj,int *Bi,int *val)
{
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);
我使用GTX 480与CC 2.0的配置和。 现在我面临的问题是,无论何时q
增加超过4096
,数组中的值全部产生为0
。 我知道我可以在X方向上使用的最大块数是65535
,每个块最多可以有(1024,1024,64)
个线程。那么为什么这个内核计算数组的错误输出呢?
你的矩阵有多大?如果它们不是非常大,我敢肯定你可以在不关闭X的情况下做到这一点!首先,32个线程似乎太低 - 你尝试过使用128还是256?另一种可能性是重写你的内核:目前,你遍历每一列的所有行。如果'rows'很大,这是非常低效的。您可以计算每个矩阵条目的“mult”结果(0或1),然后使用并行前缀和(Thrust'scan')对每列的值进行求和。 _(可能有更有效的方法,这正是我刚才想到的......)_ – kroneml 2012-08-08 07:07:25
@kroneml ...行和列以'4096','8192'等等命令....现在我在所有计算结束后使用'thrust :: inclusive_scan',并且'dCjc'是复制回主机端.... – Recker 2012-08-08 21:57:17