Разделение 2-Dim петли на несколько потоков

Мой алгоритм вычисляет вершины фигуры в 3-мерном пространстве, используя 2-мерный цикл, повторяющийся по сегментам U и V.

for (LONG i=0; i < info.useg + 1; i++) {
// Calculate the u-parameter.
u = info.umin + i * info.udelta;
for (LONG j=0; j < info.vseg + 1; j++) {
// Calculate the v-parameter.
v = info.vmin + j * info.vdelta;

// Compute the point's position.
point = calc_point(op, &info, u, v);

// Set the point to the object and increase the point-index.
points[point_i] = point;
point_i++;
}
}

Однако массив точек — это одномерный массив, поэтому point_i увеличивается в каждом цикле. Я знаю, что я мог бы вычислить индекс с помощью point_i = i * info.vseg + j,

Я хочу, чтобы этот цикл был многопоточным. Моя цель состояла в том, чтобы создать несколько потоков, которые обрабатывают определенный диапазон точек. В теме я бы сделал это так:

for (LONG x=start; x <= end; x++) {
LONG i = // ...
LONG j = // ...

Real u = info.umin + i * info.udelta;
Real v = info.vmin + j * info.vdelta;

points[i] = calc_point(op, &info, u, v);
}

Задача состоит в том, чтобы рассчитать i а также j отклонения от линейного индекса точки. Как я могу вычислить i а также j когда (ну я думаю):

point_i = i * vsegments + j

Я не могу решить математику, здесь ..

0

Решение

point_i = i * vsegments + j дает тебе:

i = point_i / vsegments
j = point_i % vsegments

Конечно, ваши петли на самом деле segments + 1 итерации каждая (индексы 0 в segments), так что вам нужно будет использовать vsegments + 1 вместо vsegments

В качестве примечания: вам действительно нужно объединить циклы в один для многопоточности? Я ожидаю, что во внешнем цикле обычно достаточно итераций, чтобы в любом случае насытить ваши доступные ядра.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]