C++ for Scientists - Technische Universität Dresden

C++ for Scientists - Technische Universität Dresden C++ for Scientists - Technische Universität Dresden

math.tu.dresden.de
from math.tu.dresden.de More from this publisher
03.12.2012 Views

260 CHAPTER 13. PARALLELISM } MPI Finalize(); return 0 ; 13.2.2 Generic Message Passing Everybody sends to process number 0. #include #include #include int main (int argc, char∗ argv[]) { MPI Init(&argc, &argv); } int myrank, nprocs; MPI Comm rank(MPI COMM WORLD, &myrank); MPI Comm size(MPI COMM WORLD, &nprocs); float vec[2]; vec[0]= 2∗myrank; vec[1]= vec[0]+1; // Local accumulation float local= std::abs(vec[0]) + std::abs(vec[1]); // Global accumulation float global= 0.0f; MPI Status st; // Receive from predecessor if (myrank > 0) MPI Recv(&global, 1, MPI FLOAT, myrank−1, 387, MPI COMM WORLD, &st); // Increment global+= local; // Send to successor if (myrank+1 < nprocs) MPI Send(&global, 1, MPI FLOAT, myrank+1, 387, MPI COMM WORLD); else std::cout ≪ ”Hello, I am the last process and I know that |v| 1 is ” ≪ global ≪ ”.\n”; MPI Finalize(); return 0 ; low abstraction level The library performs the reduction. #include #include #include

13.2. MESSAGE PASSING 261 int main (int argc, char∗ argv[]) { MPI Init(&argc, &argv); } Because: int myrank, nprocs; MPI Comm rank(MPI COMM WORLD, &myrank); MPI Comm size(MPI COMM WORLD, &nprocs); float vec[2]; vec[0]= 2∗myrank; vec[1]= vec[0]+1; // Local accumulation float local= std::abs(vec[0]) + std::abs(vec[1]); // Global accumulation float global; MPI Allreduce (&local, &global, 1, MPI FLOAT, MPI SUM, MPI COMM WORLD); std::cout ≪ ”Hello, I am process ” ≪ myrank ≪ ” and I know too that |v| 1 is ” ≪ global ≪ ”.\n”; MPI Finalize(); return 0 ; • Higher abstraction: • MPI implementation usually adapted the underlying hardware: typically logarithmic effort; can be tuned in assember for network card

13.2. MESSAGE PASSING 261<br />

int main (int argc, char∗ argv[])<br />

{<br />

MPI Init(&argc, &argv);<br />

}<br />

Because:<br />

int myrank, nprocs;<br />

MPI Comm rank(MPI COMM WORLD, &myrank);<br />

MPI Comm size(MPI COMM WORLD, &nprocs);<br />

float vec[2];<br />

vec[0]= 2∗myrank; vec[1]= vec[0]+1;<br />

// Local accumulation<br />

float local= std::abs(vec[0]) + std::abs(vec[1]);<br />

// Global accumulation<br />

float global;<br />

MPI Allreduce (&local, &global, 1, MPI FLOAT, MPI SUM, MPI COMM WORLD);<br />

std::cout ≪ ”Hello, I am process ” ≪ myrank ≪ ” and I know too that |v| 1 is ” ≪ global ≪ ”.\n”;<br />

MPI Finalize();<br />

return 0 ;<br />

• Higher abstraction:<br />

• MPI implementation usually adapted the underlying hardware: typically logarithmic ef<strong>for</strong>t;<br />

can be tuned in assember <strong>for</strong> network card

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!