Pregunta

Tengo una aplicación en serie que parallelized usando OpenMP. Simplemente añade lo siguiente a mi bucle principal:

#pragma omp parallel for default(shared)
for (int i = 0; i < numberOfEmitters; ++i)
{
    computeTrajectoryParams* params = new computeTrajectoryParams;
            // defining params...
    outputs[i] = (int*) ComputeTrajectory(params);

    delete params;
}

Parece que funciona bien: al principio, todos los subprocesos de trabajo mis ejecutar una iteración del bucle, todo va rápido, y tengo una carga de la CPU al 100% (en una máquina de cuatro núcleos). Sin embargo, después de un momento, uno de los subproceso de trabajo se detiene, y permanece en una función llamada _vcomp::PersistentThreadFunc de vcomp90.dll (el archivo es vctools\openmprt\src\ttpool.cpp), y luego otro, etc ... hasta que sólo queda el hilo principal de trabajo.

¿Alguien tiene una idea por qué sucede esto? Esto empieza a ocurrir después de aproximadamente la mitad de las iteraciones han sido ejecutadas.

¿Fue útil?

Solución

Se podría depender del esquema de planificación, y el tamaño de cómputo en cada ciclo. Si la programación es estático - cada hilo se asigna con el trabajo antes de que se ejecute. Cada hilo obtendrá 1/4 de los índices. Es posible que algunos hilos terminan antes que otros, ya que su trabajo es más fácil que la de los otros hilos (o tal vez son un poco menos cargado con otras cosas).

Trate de trabajar con la programación dinámica, y ver si funciona mejor.

Otros consejos

El pequeño comentario sobre tu código: Si el tiempo de ejecución de su ComputeTrajectory se mide en ms y tiene más de unas pocas iteraciones, realmente debería asegurarse de que tiene un asignador de memoria que está optimizado MP, ya que se puede asignar en cada iteración y ( todavía hoy en día) la mayoría de los colocadores tienen una piscina global con un bloqueo global.

También puede tratar de conseguir la asignación fuera del circuito por completo, pero si no hay suficiente información para saber si es posible aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top