Вот ядро, которое я запускаю для параллельного вычисления некоторого массива.
__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
, чтобы найти результирующий массив. У меня вопрос, есть ли возможности для улучшения/оптимизации моего ядра? Я пытался использовать общую память, но это давало либо неправильные ответы, либо выдавало исключения во время выполнения.
Кроме того, как динамически распределяемая общая память (которая выделяется третьим параметром при запуске ядра) распределяется между блоками?
Любая помощь/подсказки/инсинуации будут оценены. Заранее спасибо.
CSR
, а другая в форматеCSC
... вот почему я должен проверить, будут ли в результирующем столбце ненулевые значения или нет... Я делаю это, умножая матрицуB
каждого столбца на все строки матрицыA
(*** предполагается, что операция выполняется какC = A * B
***)... если есть не нули, я добавлю 1 к каждому местоположению результирующего массиваCjc
, чтобы послеthrust::inclusive_scan
на стороне хоста у меня был правильный массив JC что я хочу.... - person Recker   schedule 26.08.2012