¿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.)
¿Esto es C++ 98 o C++ 11? – user1071136
C++ 11 respuestas están bien –
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