Как выборочно контролировать, использовать ли openmp для блока цикла в кодеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как выборочно контролировать, использовать ли openmp для блока цикла в коде

Сообщение Anonymous »

Я хочу реализовать функцию для вокселизации модели треугольной сетки. Поскольку мне нужно пройти каждый треугольник, я хочу использовать Openmp для ускорения распараллеливания. Когда количество треугольников велико, использование Openmp эффективно, но когда количество треугольников мало, стоимость включения Openmp слишком высока. Поэтому я хочу динамически выбирать, использовать ли Openmp в зависимости от количества треугольников, как это реализовать в коде и можно ли этого добиться без простого if else, ведь две части кода практически идентичны, Openmp содержит только две дополнительные инструкции, поэтому я избегаю дублирования кода.
std::shared_ptr voxelizeInSurface(const hive3DModel::CTriangleMesh& vTriangleMesh, double vVoxelSize)
{
_ASSERTE(vVoxelSize > 0);

Eigen::AlignedBox3d BoundBox;
for (auto it = vTriangleMesh.vertexBegin(); it != vTriangleMesh.vertexEnd(); it++)
{
BoundBox.extend(it->getPosition());
}
Eigen::Vector3d MinBound = BoundBox.min().array() - vVoxelSize / 2;

auto pVoxelGrid = std::make_shared(vVoxelSize, MinBound);

const Eigen::Vector3d HalfVoxel(vVoxelSize / 2, vVoxelSize / 2, vVoxelSize / 2);
int NumTriangles = vTriangleMesh.getNumTriangles();
double InverseVoxelSize = 1 / vVoxelSize;

#pragma omp parallel for num_threads(8)
for (int i = 0; i < NumTriangles; i++)
{
const Eigen::Vector3i& Indexs = vTriangleMesh.getTriangle(i);
const Eigen::Vector3d& A = vTriangleMesh.getVertex(Indexs[0]).getPosition(),
B = vTriangleMesh.getVertex(Indexs[1]).getPosition(),
C = vTriangleMesh.getVertex(Indexs[2]).getPosition();

Eigen::Vector3d TriangleMinBound, TriangleMaxBound;
TriangleMinBound = A.cwiseMin(B).cwiseMin(C);
TriangleMaxBound = A.cwiseMax(B).cwiseMax(C);

Eigen::Vector3i MinIndex, MaxIndex;
MinIndex = Eigen::floor(((TriangleMinBound - MinBound) * InverseVoxelSize).array()).cast();
MaxIndex = Eigen::ceil(((TriangleMaxBound - MinBound) * InverseVoxelSize).array()).cast();

for (int x = MinIndex[0]; x

Подробнее здесь: https://stackoverflow.com/questions/785 ... ck-in-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»