View Single Post
Old 17th December 2020, 12:43 AM   #1
modeler
Member
Advanced member
 
Join Date: Nov 2003
Posts: 35
Default Overall support for multicore cpu

It seems the function calls does not work with parallel processing using multicore cpu. I use Openmp in some of my plugins but calling ac3d functions does not work. I can only get Openmp to work with code that does not use ac3d functions.
Here is an example code to process a list of vertices. This example divides a list of vertices depending on the number of vertices and number of cpu cores. The code then process the divided list in parallel.

typedef struct pair2_t
{
List* start, * end;
} Pair2;

int numvert1 = list_count(selver);

int cores = numvert1 / 100;
if (cores == 0)
cores = 1;
if (cores > omp_get_num_procs())
cores = omp_get_num_procs();


if (cores > 1)
{

int vertpercore = numvert1 / cores;
Pair2* p;
p = (Pair2*)_aligned_malloc(sizeof(Pair2) * cores, 16);
List* tl = NULL;
int i = 1;
int corecount = 0;
p[0].start = selver;
for (tl = selver; tl != NULL; tl = tl->next)
{

if (i == vertpercore * (corecount + 1))
{
p[corecount].end = tl->next;
if ((corecount + 1) < cores)
{
corecount++;
p[corecount].start = tl->next;
}
}
i++;
}
p[corecount].end = tl;


#pragma omp parallel for num_threads (cores) private(i)
for (i = 0; i < cores; i++)
{

getplanes(p[i].start, distance, p[i].end);
}

fprintf(file, "vertex count %d\n", numvert1);
fprintf(file, "number of cores %d\n", cores);
fprintf(file, "vertex per core %d\n", vertpercore);
for (i = 0; i < cores; i++)
{
fprintf(file, "core %d start %p end %p\n", i, p[i].start, p[i].end);
}
_aligned_free(p);

}
else
{

getplanes(selver, distance, NULL);

}
modeler is offline   Reply With Quote