Programowanie równoległe

Fizyka Techniczna III rok,

Plan wykładu

Wstęp do narzędzi numpy/scipy

  • zapis wektorowy operacji
  • praca z siatkami regularnymi
  • przyklad: równanie logistyczne
  • przykład: równanie dyfuzji

Programowanie równoległe - gruboziarniste Message Passing Interface (MPI) -

  • wstęp do MPI
  • operacje punktowe i zbiorowe (Point-to-Point, collective)
  • przykład: równanie logistyczne
  • przykład: równanie dyfuzji na klastrze, zbadanie skalowania słabego i mocnego

Literatura

Programowanie drobnoziarniste - CUDA

  • wstęp do CUDA
  • przykład - równanie dyfuzji w CUDA
  • Przykłady użycia klastrów z GPU - tzw. multi-GPU.
  • dostępne systemy w ramach plGrid

In [ ]:


In [ ]:

Zadania - MPI

Zadanie 1. Funkcja pierwotna

Napisz procedurę liczącą numerycznie funkcję pierwotną.

Zadanie 2. Zera funkcji

Napisz procedurę znajdującą miejsce zerowe funkcji.

Zadanie 3. Pochodna funkcji

Napisz procedure obliczającą numerycznie pierwszą i drugą pochodną funkcji stosując róźnice skończone.

http://en.wikipedia.org/wiki/Finite_difference_coefficient

Zadanie 4.

Napisz procedurę znajdującą maxima funkcji.

Zadanie 5.

Całkowanie funkcji danej wzorem analitycznym.


In [ ]:


In [ ]:

Zadania - CUDA

PDE, SDE: wydajność

Zbadać jak zmienia się wydajność programu w zależności od wielkości bloku na danym procesorze GPU.

SDE: curand

W przykładzie symulacji SDE, zastąpić generator curandem i porównać wydajność.

SDE: ElementwiseKernel

Napisać program całkujący równanie stochastyczne, wykorzystujące ElementwiseKernel


In [ ]:
from pycuda.elementwise import ElementwiseKernel
SDE2 = ElementwiseKernel(
        "float *x,unsigned int  *rng_state",
        "x[i] = x[i]+0.01*f(x[i]) + sqrtf(0.01*0.1)*rng_uni( &(rng_state[i]) ) ",
        "SDE",
        preamble="""
        __device__ float f(float x)
        { 
          return sin(x)+0.1;
        }
        """+rng_src)

CUDA: Równanie dyfuzji 2d

Napisać program rozwiązujący równanie dyfuzji 2d metodą symulacji odpowiedniego SDE.

CUDA: Równanie falowe

Zaimplementuj w CUDA równanie falowe w dwóch wymiarach.


In [ ]:

Notatki

onedimensionalcellularautomata

https://github.com/btbonval/onedimensionalcellularautomata

łatka:


In [ ]:
# %load MPI/patch
diff --git a/rules.py b/rules.py
index 3773e15..5e5d6f8 100644
--- a/rules.py
+++ b/rules.py
@@ -3,7 +3,7 @@ Example rules are defined herein. Rules are generally meant to be defined by
 the user.
 '''
 
-from itertools import imap, repeat, izip
+from itertools import repeat
 from utils import i2bt, bt2i
 
 # Generate Wolfram's rules for neighborhood 1 automata
@@ -24,6 +24,6 @@ def wolfram(rulenum):
     width = 3
     image = i2bt(rulenum, 2**width)[::-1]
     # for 0 to 8, run i2bt(0, width) to i2bt(8, width)
-    preimage = imap(i2bt, range(0,2**width), repeat(width))
+    preimage = map(i2bt, range(0,2**width), repeat(width))
     # line up the preimages with the images and make it a dict/hashmap
-    return dict(izip(preimage, image))
+    return dict(zip(preimage, image))
diff --git a/update.py b/update.py
index 60144fc..c43d0a7 100644
--- a/update.py
+++ b/update.py
@@ -9,9 +9,9 @@ import numpy
 from matplotlib import pyplot
 from matplotlib import cm
 
-from itertools import imap
+# from itertools import imap
 from itertools import repeat 
-from itertools import izip
+# from itertools import izip
 
 from utils import bt2i
 
@@ -43,7 +43,7 @@ def prepare_update(state, neighborhood, rule):
     #return q
 
     # comments above left for readability, all of it strung together for speed:
-    return imap(rule.__getitem__, imap(tuple, imap(state.__getitem__, imap(neighborhood, range(0,l)))))
+    return map(rule.__getitem__, map(tuple, map(state.__getitem__, map(neighborhood, range(0,l)))))
 
 def update(*args, **kwargs):
     '''

In [ ]: