referencia programacion paralela mpi_init lenguajes lenguaje definir con comunicadores aplicaciones c++

c++ - mpi_init - programacion paralela con mpi



Asignación paralela en C++ (6)

Eso no es posible. Su ejemplo de código

a, b = b, a;

se interpreta de la siguiente manera:

a, (b = b), a

No hace nada. El operador de coma hace que devuelva el valor de a (el operando más a la derecha). Debido a que la asignación se une más, b = b está en parens.

La forma correcta de hacerlo es solo

std::swap(a, b);

Boost incluye una clase de tupla con la que puedes hacer

tie(a, b) = make_tuple(b, a);

Crea internamente una tupla de referencias a ayb, y luego le asigna una tupla de by a.

¿Hay alguna forma de realizar tareas paralelas en C ++? Actualmente, las siguientes compilaciones (con advertencias)

#include <iostream> int main() { int a = 4; int b = 5; a, b = b, a; std::cout << "a: " << a << endl << "b: " << b << endl; return 0; }

y grabados:

a: 4 b: 5

Lo que me gustaría que imprimiera ... si no fuera obvio, es:

a: 5 b: 4

Como en, digamos, ruby ​​o python.


La asignación paralela no es compatible con C ++. Los lenguajes que soportan esto normalmente tratan a,b,c como una lista en cualquier lado del operador de asignación, esta no es la forma en que funciona el operador de coma en C ++. En C ++, a, b evalúa a y luego b, entonces a, b = b, a es lo mismo que a; b = b; a; a; b = b; a; .


O Lua ...
Hay trucos con C / C ++, como usar xor u operaciones, pero con riesgo de desbordamiento y tal. Solo hazlo de la manera dolorosa, con tres asignaciones. No es un gran trato.


O Perl. Pero no, no es posible (hasta donde yo sepa), necesita usar una variable temporal, como en:

int a = 4; int b = 5; { int tmp = a; a = b; b = tmp; }

FYI, internamente esos idiomas (o Perl atleast) crean una lista temporal { a, b } , luego asignan la lista a las dos variables. En otras palabras, esto es al menos tan eficiente, aunque solo sea un poco más desordenado.


No hay tal función en la Biblioteca estándar. Podrías escribir un conjunto de funciones de plantilla:

template <typename T1> void ParAssign(T1& Lhs_1, T1 const& Rhs1); template <typename T1, typename T2> void ParAssign(T1& Lhs1, T2& Lhs2, T1 const& Rhs1, T2 const& Rhs2); // etc. ParAssign(a,b, b,a);

Eso no es trivial si hay aliasing, como en su ejemplo de intercambio.


Esta pregunta es muy antigua, me encontré con ella hoy ...
... y me pregunté por qué nadie dio esta respuesta antes ...

Creo que es posible hacerlo en C ++ 11 similar a Python (bajo el capó):

#include <iostream> using namespace std; int main() { int a = 4, b = 5; cout << "Before assignment: a: " << a << ", b: " << b << endl; pair<int&, int&> ba(b, a); ba = make_pair(a, b); // <===: (b, a) = (a, b) cout << "After assignment : a: " << a << ", b: " << b << endl; return 0; }

Probé esto en ideone.com . La salida fue:

Before assignment: a: 4, b: 5 After assignment : a: 5, b: 4

Si recuerdo bien (no soy un experto en Python), en Python, a, b denota un par. ( Python Doc .: 5.3. Tuplas y secuencias )

Tal par se puede hacer en C ++ 11 fácilmente, por ejemplo, con std::pair . En este caso, hice un par de referencias y asigné el par de valores. Funciona como make_pair() carga ambas variables antes de asignar el par correcto (de valores) al par de referencias izquierdas.

Desplazándome de nuevo, me doy cuenta de que esta respuesta está cerca de la solución basada en el impulso de la respuesta de Johannes .

Puede ser, la razón es que no funcionó en C ++ 03. Intenté en coliru.stacked-crooked.com: con -std=c++03 resulta terrible leer los errores del compilador, cambiando a -std=c++11 y se compila y ejecuta -std=c++11 como se describe arriba.

Renuncia

Simplemente no puedo imaginar para qué sirve esta solución ni qué valor práctico puede tener. Esto no es lo que traté de hacer. Como muchas otras respuestas dicen "No funciona". En mi humilde opinión lo hace (deletreado correctamente de acuerdo con el lenguaje C ++) ...