c++ x86 openmp atomic minimum

c++ - Mínimo atómico en x86 con OpenMP



atomic minimum (1)

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, de modo 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.

¿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?

En las especificaciones 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 ++ declara

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

pero para Fortran afirma

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

En caso de que esté interesado en más contexto: estoy buscando un método libre de mutex para hacer lo siguiente:

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 puedes calcular el mínimo usando un algoritmo de reducción. 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.

EDITAR: Una opción que es un poco más rápida en mi caso es

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

pero esa no es una operación atómica.

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