Я хочу реализовать функцию для вокселизации модели треугольной сетки. Поскольку мне нужно пройти каждый треугольник, я хочу использовать 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
Как выборочно контролировать, использовать ли openmp для блока цикла в коде ⇐ C++
Программы на C++. Форум разработчиков
1716514991
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
Подробнее здесь: [url]https://stackoverflow.com/questions/78526154/how-to-selectively-control-whether-to-use-openmp-for-a-loop-block-in-code[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия