рд╣реИрд▓реЛ рдЦрдмреНрд░реЛрд╡рд┐рдЯреНрд╕, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рджреЛ MPI рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ (mpich2) рдФрд░ NVIDIA CUDA рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдЬреЛ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рддрдХрдиреАрдХреЛрдВ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдЪрд▓реЛ ...

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯреА рдпреЛрдЬрдирд╛ рд▓рд┐рдЦреА, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ:
1) рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рддреИрдпрд╛рд░ рдХрд░рдирд╛ред
2) mpich2 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
3) NVIDIA CUDA рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ред
4) рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рд▓рд┐рдЦрдирд╛ (рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрд░рдЪрдирд╛)
5) рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ред
6) рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕рдВрдХрд▓рди рдФрд░ рд▓реЙрдиреНрдЪред
рдмрд┐рдВрджреБ 1
рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдерд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреАред рдореИрдВ Ubuntu 12.04 рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдПрдХ рдмреИрдЪ рдореИрдиреЗрдЬрд░ рдкреВрд░реЗ рд╕реЗрдЯрдЕрдк рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ - рд╕рд┐рдиреЗрдкреНрдЯрд┐рдХ
sudo apt-get install synaptic
рдпрд╛, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рд╕реАрдзреЗ рд╕рдм рдХреБрдЫ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдмрд┐рдВрджреБ 2
рдФрд░ рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред MPI рдХреНрдпрд╛ рд╣реИ? рдореИрдВ
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд╣рдЯрд╛рддрд╛ рд╣реВрдВ - рдпрд╣ рдПрдХ рддрд░рд╣ рдХрд╛ рдПрдкреАрдЖрдИ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, рдпрд╣ рдХрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЖрдк рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо MPICH2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ - рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЬреЛ MPI рдорд╛рдирдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдмрд╕реЗ рдЖрдо рд╣реИред рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
sudo apt-get install mpi-default-dev
sudo apt-get install mpich2
sudo apt-get install libmpich2-dev
рдпрд╛ Alt + f2:
gksu synaptic
рдФрд░ рдЦреЛрдЬ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ:
mpi-default-dev
mpich2
libmpich2-dev

рдкрд╛рдпрд╛ рдЧрдпрд╛ рдкреИрдХреЗрдЬ рдЪреБрдиреЗрдВ рдФрд░ рдЗрд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ mpi рдпрд╛ mpich2 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рд▓реЗрдЦрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рдЕрдЧрд▓рд╛, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ, рдПрдХ рдлрд╝рд╛рдЗрд▓ test.cpp рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:
#include <mpi.h> #include <iostream> int main (int argc, char* argv[]) { int rank, size; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &rank); MPI_Comm_size (MPI_COMM_WORLD, &size); std::cout<<"\nHello Habrahabr!!"<<std::endl; MPI_Finalize(); return 0; }
рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
mpic++ test.cpp -o test
рдЪрд▓рд╛рдПрдБ:
mpirun.mpich2 -l -n 8 ./test
рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдмрд┐рдВрджреБ 3
рдореИрдВрдиреЗ рдЕрдкрдиреА рдЕрдВрддрд┐рдо
рдкреЛрд╕реНрдЯ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред
рдмрд┐рдВрджреБ 4
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣рдмрд▓ рдлрд╝реЛрд▓реНрдбрд░ рд╣реИ, рддреЛ рдЙрд╕рдореЗрдВ рдирд┐рдореНрди рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдБ:
main.cu
head.h // рдЗрд╕рдореЗрдВ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреАред
GPU.cu // рдХреЛрдб GPU рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред
CPU.cpp // рдХреЛрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИред
main.cu - рдпрд╣рд╛рдБ рд╣рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ mpi рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдХрдИ рдХреЛрд░ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред Gpu рдФрд░ cpu рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдгрди рд╣реЛрддрд╛ рд╣реИ, рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ gpu рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЧреБрдгрди рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рд╣реЛрддрд╛ рд╣реИред
#include "head.h" int main(int argc, char* argv[]){ int rank, size; int x = 9999; int y = 9999; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &rank);
head.h - рдпрд╣рд╛рдБ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдирд┐рд╖реНрдХрд░реНрд╖реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
#include <iostream> #include <mpi.h> #include <cuda.h> #include "CPU.cpp" #include "GPU.cu"
GPU.cu - рд╕реАрдзреЗ рдПрдХ рдХреЛрдб рдЬреЛ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИред
#include <cuda.h> #include <iostream> #include <stdio.h> __global__ void mult(int x, int y, int *res) { *res = x * y; } int gpu(int x, int y){ int *dev_res; int res = 0; cudaMalloc((void**)&dev_res, sizeof(int)); mult<<<1,1>>>(x, y, dev_res); cudaMemcpy(&res, dev_res, sizeof(int), cudaMemcpyDeviceToHost); cudaFree(dev_res); return res; }
CPU.cpp - рдпрд╣ рдХреЛрдб, GPU рдкрд░ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЧреБрдгрди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдирд╣реАрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
int cpu(int x, int y){ int res; res = x * y; return res; }
рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ ../src рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд╛рд▓ рджреА рдЬрд╛рддреА рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдмрд┐рдВрджреБ 5
рдпрд╣рд╛рдБ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ CUDA рдХреЛрдб, рдмрд▓реНрдХрд┐ MPI рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП nvcc рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЫреЛрдЯреА рд╕реА рдлрд╛рдЗрд▓ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
CXX = nvcc LD = $(CXX) LIBS_PATH = -L/usr/lib LIBS = -lmpi -lopa -lmpl -lrt -lcr -lpthread INCLUDE_PATH = -I/usr/lib/mpich2/include/ FLAGS = -g TARGET = "/home/relaps/habr/src/main.cu" OBIN = "/home/relaps/habr/bin/cuda&mpi" all: $(TARGET) $(TARGET): $(LD) $(INCLUDE_PATH) $(FLAGS) $(TARGET) -o $(OBIN) $(LIBS_PATH) $(LIBS)
рдФрд░ рдЗрд╕рд▓рд┐рдП рдЕрдм рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдмрд┐рдВрджреБ 6
рдпрд╣рд╛рдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдмрд╣реБрдд рд╣реА рд╢рд╛рдирджрд╛рд░ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред
рд╣рдо рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИ:

рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдВрдд рдореЗрдВ рд╣рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдФрд░ рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рджреЛрдиреЛрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдмреЗрд╢рдХ, рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЧреБрдгрди рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдЗрди рддрдХрдиреАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ - рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдПрдордкреАрдЖрдИ рдФрд░ рдХреНрдпреВрдбрд╛ рдПрдХ рд╣реА рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реИ рдХреНрдпреВрдбрд╛ рдФрд░ рдПрдордкреАрдЖрдИ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред , рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рд╛рде рдХрдИ рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ, рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ, рдЖрджрд┐, рдЖрдк рдпрд╣рд╛рдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд┐рдЪрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
ps рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдореИрдВ рдПрдирд╡реАрдбрд┐рдпрд╛ рдХреНрдпреВрдбрд╛ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред