这是我为了并行计算某个数组而启动的内核。
__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
来查找我的结果数组。
我的问题是,我的内核有任何改进/优化的空间吗?我尝试使用共享内存,但它产生错误答案或抛出运行时异常。
此外,动态分配的共享内存(由内核启动中的第三个参数分配)如何在块之间分配?
任何帮助/提示/暗示将不胜感激。 提前致谢。
答案 0 :(得分:1)
使用kernel<<<blocks,threads,mem>>>
mem分配的共享内存是每个块分配的内存量。因此每个块获得mem
个内存量。
对于你的代码,我不明白为什么mult函数中有2个for循环。只是想指出每个线程将执行这2个for循环。此外,由于您在kernel
函数中也有一个for循环,这意味着每个线程将多次在mult函数中执行2 for
个循环。这很慢。而且,做
int beg = Bptr[tid];
int end = Bptr[tid+1];
并不是完全合并的访问权限。非合并访问速度很慢。