Я заинтересован в том, чтобы ускорить реализацию Myers diff, запустив ее на GPU, то есть с OpenCL. У меня хорошее понимание алгоритма, но я новичок в программировании на GPU. Я догадываюсь, что GPU не будет работать хорошо, но я хотел бы услышать мысли и идеи.
Вот описание одной итерации алгоритма на языке C. У нас есть два постоянных буфера байтов 'left' и 'right' (данные, которые мы сравниваем) и общий изменяемый массив int32, называемый vector. 'idx' - это индекс итерации. Тогда алгоритм по сути такой:
void myers_diff_iteration(const uint8 *left, const uint8 *right, int32 *vector, int32 idx) {
int32 x = MAX(vector[idx-1], vector[idx+1]);
int32 y = idx - x;
while (left[x] == right[y]) {
x++;
y++;
}
vector[x] = x;
}
Я предполагаю, что цикл while (который имеет очень непредсказуемое количество итераций, в диапазоне от нуля до миллиона), вероятно, будет очень плохим для графического процессора и устранит любой выигрыш в производительности. Это правда? Любые советы, как это улучшить?
Кроме того, вектор является общим для всех итераций цикла. Каждая итерация выполняет запись в другое место, поэтому синхронизация не требуется (кроме того, что запись в выровненное 4-байтовое слово не влияет на соседние слова). Будет ли такой общий вектор работать хорошо?
Спасибо за любую помощь!