Задать вопрос
Kalombyr
@Kalombyr

Можно ли и имеет ли смысл этот код перенести на OpenCL?

Доброго дня!
Есть вот такой участок кода:

struct TTour {
   QVector<int> tour;
   double cost;
};

TTour Tournamet::iter(const TTour &currentTour)
{
    int n = currentTour.tour.count();
    TTour bestTour = currentTour;
    for(int i=1; i<n-2; ++i){
        for(int j=i+1; j<n+1; ++j) {
            if(j-i == 1) continue;
            QVector<int> swap = currentTour.tour.mid(0, i);
            QVector<int> l1 = currentTour.tour.mid(i, j-i);
            QVector<int> l2 = currentTour.tour.mid(j);

            std::reverse(l1.begin(), l1.end());

            swap.append(l1);
            swap.append(l2);

            TTour newTour = {swap, cost(swap)};
            if( newTour.cost < bestTour.cost ) bestTour = newTour;
        }
    }
}


double Tournamet::cost(const QVector<int> &points)
{
    double total = 0;
    for(int i=1; i<points.count(); ++i) {
        total += _distancer->dist(points[i-1], points[i]);  //-- Внутри расстояние отдаётся из QHash, каждый раз не вычисляется.
    }    
    return  total;
}


Подумал, что пришло время изучить OpenCL, что бы оптимизировать этот участок.
Собственно вопрос, можно ли, а главное - имеет ли смысл (в плане распараллеливания и ускорения) его переносить?
P.S. "попробуй, да узнаешь" - обязательно попробую. Но хочется понять почему может быть бессмысленно в плане производительности и прочего и может быть лучше пробовать на другом примере...
  • Вопрос задан
  • 107 просмотров
Подписаться 1 Средний 2 комментария
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Скорее всего параллелизм ничего не даст. Дело в том что параллелятся задачи когда
1) Shared nothing. Есть множество процессов и они работают со своими массивами данных а потом сливают результат в некий итог.
2) Шарятся данные но при этом они иммутабельные.
В твоём случае используются операции такие std::reverse, QVector::mid. Они ломают общий снапшот данных и не дают выполится пункту (2).

Вобщем надо серъезно сломать алгоритм чтобы получить ползу от параллелизма.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы