Я заинтересован в более быстрой реализации Myers diff, запустив ее на графическом процессоре, то есть с OpenCL. Я хорошо понимаю алгоритм, но новичок в программировании на GPU. Я предполагаю, что графический процессор не будет работать хорошо, но я хотел бы услышать мысли и идеи.
Вот описание одной итерации алгоритма на C. У нас есть два буфера констант с байтами «слева» и «справа» (данные, которые мы сравниваем), и общий изменяемый массив int32, называемый вектором. '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-байтовое слово не влияла на соседние слова). Будет ли такой общий вектор работать хорошо?
Спасибо за любую помощь!