2012-09-04 18 views
7

¿OpenMP admite un mínimo atómico para C++ 11? Si OpenMP no tiene un método portátil: ¿hay alguna forma de hacerlo usando una función x86 o amd64?Mínimo atómico en x86 con OpenMP

En las especificaciones de OpenMP no encontré nada para C++, pero la versión de Fortran parece ser compatible. Vea 2.8.5 de la v3.1 para los detalles. Para C++ afirma

binop es uno de +, *, -, /, &, ^, |, < <, o >>.

pero para Fortran afirma

intrinsic_procedure_name es uno de MAX, MIN, IAND, IOR, o IEOR.

En caso de estar interesado en más de contexto: Busco a un método libre de exclusión mutua de la siguiente manera:

vector<omp_lock_t>lock; 
vector<int>val; 

#pragma omp parallel 
{ 
    // ... 
    int x = ...; 
    int y = ...; 
    if(y < val[x]){ 
    omp_set_lock(&lock[x]); 
    if(y < val[x]) 
     val[x] = y; 
    omp_unset_lock(&lock[x]); 
    } 
} 

Sé que se puede calcular el mínimo uso de un algoritmo de reducir. Sé que hay circunstancias en las que esto supera en gran medida cualquier enfoque mínimo atómico. Sin embargo, también sé que este no es el caso en mi situación.

EDIT: Una opción que es ligeramente más rápido en mi caso es

int x = ...; 
    int y = ...; 
    while(y < val[x]) 
    val[x] = y; 

pero que se realiza ninguna operación atómica.

Todas las GPU más nuevas tienen esta característica y me falta la CPU. (Consulte atom_min para OpenCL.)

+0

¿Esto es C++ 98 o C++ 11? – user1071136

+0

C++ 11 respuestas están bien –

+0

Por cierto, ¿por qué es que atomic-min es más rápido en su caso? Tuve un problema similar donde la reducción-min no mejoró el rendimiento, así que tal vez debería probar atomic-min. – user1071136

Respuesta

4

La especificación OpenMP para C++ no tiene soporte para mínimo atómico. Tampoco lo hace C++ 11.

Supongo que en su algoritmo, x puede calcular cualquier índice válido, independientemente del hilo. Sugeriría cambiar su algoritmo, para que cada subproceso use su propia matriz val y luego realice una reconciliación final al final, que también puede ser paralelizada por índice. Esto evitará bloqueos y átomos por completo y le dará la ventaja de separar los datos para cada hilo, es decir, no hay posibilidad de compartir el caché falso. En otras palabras, debería ser más rápido.