Я учусь использовать opencl на FPGA и написал программу для реализации алгоритма Смита-Ватермана . Но в результате программа на CPU работает быстрее, чем на FPGA.
Вот мой код ядра:
__kernel void __attribute__ ((reqd_work_group_size(512,512,1)))
krnl_sw(
__global int* ref,
__global int* alt,
__global int* sw,
const int match,
const int mismatch,
const int open,
const int extend,
const int ncol,
const int nrow
) {
int col = get_global_id(0);
int row = get_global_id(1);
for (k = 2;k<ncol+nrow-1;k++)
{
if(col + row == k)
{
up_score = sw[(row - 1)*ncol + col] + extend*(row-1) + open ;
left_score = sw[row*ncol + col - 1] + extend*(row-1) + open ;
up_left_score = sw[(row - 1)*ncol + col - 1] + diag_score(ref[col - 1], alt[row - 1], match, mismatch);
sw[row*ncol + col] = max(up_score, left_score);
sw[row*ncol + col] = max(up_left_score, sw[row*ncol + col]);
}
}
return;
}
Код на процессоре:
for (i = 1;i < ncol;i++)
{
for (j = 1;j< nrow;j++)
{
up_score = sw[j - 1][i] + extend*(j-1)+open;
left_score = sw[j][i - 1] + extend * (i - 1) + open;
up_left_score = sw[j - 1][i - 1] + diag_score(ref[i - 1], alt[j - 1], match, mismatch);
sw[j][i] = max(up_score, left_score);
sw[j][i] = max(up_left_score, sw[j][i]);
}
}
Что-то не так с кодом ядра?