Вот ядро, которое я запускаю для вычисления некоторого массива параллельно.Ядро Cuda - возможные оптимизации
__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);
Я должен признать, что это ядро работает довольно slow.Once я получаю массив обратно в принимающей стороне, я использую thrust::inclusive_scan
, чтобы найти мой результирующий массив. Мой вопрос: есть ли место для улучшения/оптимизации для моего ядра? Я пытался использовать разделяемую память, но это порождало неправильные ответы или бросало исключения во время выполнения.
Также как распределяется динамически распределенная разделяемая память (которая выделяется третьим параметром при запуске ядра) среди блоков?
Любая помощь/подсказки/инсинуации будут оценены по достоинству. Спасибо заранее.
Можете ли вы просто объяснить в плоских словах, что ваш код должен делать? то у нас есть больше шансов помочь вам с оптимизациями –
@asm ... пытается найти массив JC результирующей разреженной матрицы при умножении двух разреженных матриц .... – Recker
ok gotcha, вы реализуете smth, как массивы JLM Matlab. Я буду попробуйте придумать некоторые идеи –