To copy all examples and exercises to your local scratch directory type: /g/public/training/openmp/setup.sh
|
|
|
- Hugo Harrington
- 10 years ago
- Views:
Transcription
1 OpenMP by Example
2 To copy all examples and exercises to your local scratch directory type: /g/public/training/openmp/setup.sh
3 To build one of the examples, type make <EXAMPLE.X> (where <EXAMPLE> is the name of file you want to build (e.g. make test.x will compile a file test.f). To build all examples at once, just type make
4 Basic Architecture Older processor had only one cpu core to execute instructions processor core MEMORY
5 Basic Architecture Older processor had only one cpu core to execute instructions Modern processors have 4 or more independent cpu cores to execute instructions processor processor core core core core core MEMORY MEMORY
6 Basic Architecture (EOS) An EOS node consists of two processors (4 cpu cores each) and total memory of 24GB NODE processor processor core core core core core core core core 24GB MEMORY
7 Sequential Program instructions When you run sequential program Instructions executed on 1 core Other cores are idle core core core core MEMORY
8 Sequential Program instructions When you run sequential program Instructions executed on 1 core Other cores are idle core core Waste of available resources. We want all cores to be used to execute program. core core HOW? MEMORY
9 What is OpenMP? Defacto standard API for writing shared memory parallel applications in C, C++, and Fortran OpenMP API consists of: Compiler Directives Runtime subroutines/functions Environment variables
10 HelloWorld PROGRAM HELLO!$OMP PARALLEL PRINT *, Hello World!$ OMP END PARALLEL STOP END #include <iostream> #include omp.h int main() { #pragma omp parallel { std::cout << Hello World\n } return 0; } intel: ifort -openmp -o hi.x hello.f pgi: pgfortran -mp -o hi.x hello.f gnu: gfortran -fopenmp -o hi.x hello.f intel: icc -openmp -o hi.x hello.f pgi: pgcpp -mp -o hi.x hello.f gnu: g++ -fopenmp -o hi.x hello.f Export OMP_NUM_THREADS=4./hi.x
11 HelloWorld PROGRAM HELLO!$OMP PARALLEL PRINT *, Hello World!$ OMP END PARALLEL STOP END #include <iostream> #include omp.h int main() { #pragma omp parallel { std::cout << Hello World\n } return 0; } OMP COMPILER DIRECTIVES intel: ifort -openmp -o hi.x hello.f pgi: pgfortran -mp -o hi.x hello.f gnu: gfortran -fopenmp -o hi.x hello.f intel: icc -openmp -o hi.x hello.f pgi: pgcpp -mp -o hi.x hello.f gnu: g++ -fopenmp -o hi.x hello.f Export OMP_NUM_THREADS=4./hi.x OMP ENVIRONMENTAL VARIABLE NOTE: example hello.f90
12 Fortran, C/C++ fortran directive format:!$ OMP PARALLEL [clauses] :!$OMP END PARALLEL Will discuss later! C/C++ directive format is: #pragma omp parallel [clauses] { : } New line required All OpenMP directives follow this format.
13 At run time Program Hello Runtime creates 3 additional worker threads at start of openmp region Thread #0 Thread #1 Thread #2 Thread #3 Print *, hello Print *, hello Print *, hello Print *, hello OMP region, every thread executes all the instructions in the OMP block end
14 Fork/Join Model OpenMP follows the fork/join model: OpenMP programs start with a single thread; the master thread (Thread #0) At start of parallel region master creates team of parallel worker threads (FORK) Statements in parallel block are executed in parallel by every thread At end of parallel region, all threads synchronize, and join master thread (JOIN) Implicit barrier. Will discuss synchronization later
15 Fork/Join Model OpenMP follows the fork/join model: OpenMP programs start with a single thread; the master thread At start of parallel region master creates team of parallel worker threads (FORK) Statements in parallel block are executed in parallel by every thread At end of parallel region, all threads synchronize, and join master thread (JOIN) Implicit barrier. Will discuss synchronization later F O R K Thread #0 Thread #1 Thread #2 Thread #3 J O I N
16 OpenMP Threads versus Cores What are threads, cores, and how do they relate? Thread is independent sequence of execution of program code Block of code with one entry and one exit For our purposes a more abstract concept Unrelated to Cores/CPUs OpenMP threads are mapped onto physical cores Possible to map more than 1 thread on a core In practice best to have one-to-one mapping.
17 More About OpenMP Threads Number of openmp threads can be set using: Environmental variable OMP_NUM_THREADS Runtime function omp_set_num_threads(n) Other useful function to get information about threads: Runtime function omp_get_num_threads() Returns number of threads in parallel region Returns 1 if called outside parallel region Runtime function omp_get_thread_num() Returns id of thread in team Value between [0,n-1] // where n = #threads Master thread always has id 0
18 HelloThreads Exercise Extend the program below to make it parallel where every thread prints out it's id and total number of threads FORTRAN C++ PROGRAM HELLOTHREADS INTEGER THREADS, ID PRINT *, NUM THREADS:, THREADS PRINT *, hello from thread:,id, out of, threads STOP END int main() { int threads = 100; int id = 100; } std::cout << hello from thread:,id << out of ; std::cout << threads << \n ; return 0; NOTE: exercise hello_treads
19 Shared Memory Model The memory is (logically) shared by all the cpu's $OMP PARALLEL THREADS = omp_get_num_threads() ID = omp_get_thread_id() :!$ OMP END PARALLEL Relevant piece of code from our example on previous page Thread 0 Thread 1 var: THREADS Var: ID Thread 2 Shared memory Thread 3 All threads try to access the same variable (possibly at the same time). This can lead to a race condition. Different runs of same program might give different results because of race conditions
20 Shared and Private Variables OpenMP provides a way to declare variables private or shared within an OpenMP block.this is done using the following OpenMP clauses: SHARED ( list ) All variables in list will be considered shared. Every openmp thread has access to all these variables PRIVATE ( list ) Every openmp thread will have it's own private copy of variables in list No other openmp thread has access to this private copy For example:!$omp PARALLEL PRIVATE(a,b,c) (fortran) or #pragma omp parallel private(a,b,c) (C/C++) By default most variables are considered shared in OpenMP. Exceptions include index variables (Fortran, C/C++) and variables declared inside parallel region (C/C++)
21 NOTE: exercise hello_threads_private HelloThreads Exercise (2) Adapt the program below such that all relevant variables are correctly classified as OpenMP private/shared FORTRAN C++ PROGRAM HELLOTHREADS INTEGER THREADS, ID!$OMP PARALLEL threads = omp_get_num_threads() id = omp_get_thread_num() PRINT *, NUM THREADS:, THREADS PRINT *, hello from thread:,id, out of, threads!$omp PARALLEL END STOP END int threads = 100; int id = 100; #pragma omp parallel { threads = omp_get_num_threads() id = omp_get_thread_num() std::cout << hello from thread:,id << out of ; std::cout << threads << \n ; } return 0;
22 Revisit Shared Memory Model The memory is (logically) shared by all the cpu's There is also private memory for every openmp thread THREADS THREADS THREADS THREADS ID ID ID ID Thread 0 Thread 1 Thread 2 Thread 3 shared variables threads and id still exist, but every thread also has a private copy of variables threads and id. There will not be any race condition for these private variables var: THREADS var: ID Shared memory
23 TIP: Practical Issue OpenMP creates separate data stack for every worker thread to store copies of private variables (master thread uses regular stack) Size of these stacks is not defined by OpenMP standards Intel compiler: default stack is 4MB gcc/gfortran: default stack is 2MB Behavior of program undefined when stack space exceeded Although most compilers/rt will throw seg fault To increase stack size use environment var OMP_STACKSIZE, e.g. export OMP_STACKSIZE=512M export OMP_STACKSIZE=1GB To make sure master thread has large enough stack space use ulimit -s command (unix/linux). NOTE: example stacksize
24 Work Sharing (manual approach) So far only discussed parallel regions that all did same work. Not very useful. What we want is to share work among all threads so we can solve our problems faster. :!$OMP PARALLEL PRIVATE(n,num,id,f,l) id = omp_get_thread_num() num = omp_get_num_threads() f = id*(n/num)+1 l = (id+1)*(n/num) DO n=f,l,1 A(n) = A(n) + B ENDDO!$ OMP END PARALLEL : Partition the iteration space manually, every thread computes N/num iterations Can be cumbersome and error prone!
25 Work Sharing Suppose: N=100 and num=4 N/num=25 f = id*(n/num)+1 l = (id+1)*(n/num) DO n=f,l,1 A(n) = A(n) + B ENDDO Thread 0 Thread 1 Thread 2 Thread 3 f=0*25+1 = 1 l=1*25 = 25 f=1*25+1=26 l=2*25 = 50 f=2*25+1=51 l=3*25 = 75 f=3*25+1=76 l=4*25 = 100 Thread 0 computes elements from index 1 to 25, Thread 1 computes from index 26 to 50, etc. The above implementation makes one big assumption. What is it? NOTE: example work_sharing_f, vary threads
26 Work Sharing (openmp approach) FORTRAN!$OMP PARALLEL!$OMP DO DO I=1,100 A(I) = A(I) + B ENDDO!$OMP END DO!$ OMP END PARALLEL C++ #pragma omp parallel { #pragma omp for for (i=0;i<100;++i) { A(I) = A(I) + B } OpenMP takes care of partitioning the iteration space for you. The only thing needed is to add the!$omp DO and!$omp END DO directives even more compact by combining omp parallel/do directives FORTRAN!$OMP PARALLEL DO DO I=1,100 A(I) = A(I) + B ENDDO!$ OMP END PARALLEL DO C++ #pragma omp parallel for for (i=0;i<100;++i) { A(I) = A(I) + B } NOTE: example work_sharing_omp, compare with work_sharing_f
27 Exercise Create a program that computes a simple matrix vector multiplication b=ax, either in fortran or C/C++. Use OpenMP directives to make it run in parallel.
28 Reductions A common type of computation is something like: DO i=1,10 for (int i=0;i<10;++i) { a = a op expr a = a op expr ENDDO } a = a op expr is called a reduction operation. Obviously, there is a loop carried flow dependence (will discuss later) for variable 'a' which prohibits parallelization. For these kind of cases OpenMP provides the REDUCTION(op:list) clause. This clause can be applied when the following restrictions :are met: a is a scalar variable in the list expr is a scalar expression that does not reference a Only certain kind of op allowed; e.g. +,*,- For fortran op can also be intrinsic; e.g. MAX,MIN,IOR Vars in list have to be shared
29 Exercise Create a program that computes the sum of all the elements in an array A (in fortran or C/C++) or a program that finds the largest number in an array A (Fortran). Use OpenMP directives to make it run in parallel.
30 TIP: OpenMP Scoping Rules So far we have all the directives nested within the same Routine (!$OMP PARALLEL outer most). However, OpenMP provides more flexible scoping rules. E.g. It is allowed to have routine with only!$omp DO In this case we call the!$omp DO an orphaned directive. Note: There are some rules (e.g. When an!$omp DO directive is encountered program should be in parallel section)
31 How OMP schedules iterations? Although the OpenMP standard does not specify how a loop should be partitioned most compilers split the loop in N/p (N #iterations, p #threads) chunks by default. This is called a static schedule (with chunk size N/p) For example, suppose we have a loop with 1000 iterations and 4 omp threads. The loop is partitioned as follows: 1000 THREAD 1 THREAD 2 THREAD 3 THREAD
32 Static Schedule To explicitly tell the compiler to use a static schedule (or a different schedule as we will see later) OpenMP provides the SCHEDULE clause $!OMP DO SCHEDULE (STATIC,n) // (n is chunk size) For example, suppose we set the chunk size n= NOTE: example static_schedule, vary chunk size
33 Issues with Static schedule With static scheduling the number of iterations is evenly distributed among all openmp threads (i.e. Every thread will be assigned similar number of iterations). This is not always the best way to partition. Why is This?
34 Issues with Static schedule With static scheduling the number of iterations is evenly distributed among all openmp threads (i.e. Every thread will be assigned similar number of iterations). This is not always the best way to partition. Why is This? Iterations Time per iteration thread2 thread3 thread4 This is called load imbalance. In this case threads 2,3, and 4 will be waiting very long for thread 1 to finish thread1 How can this happen?
35 Dynamic Schedule With a dynamic schedule new chunks are assigned to threads when they come available. OpenMP provides two dynamic schedules: $!OMP DO SCHEDULE(DYNAMIC,n) // n is chunk size Loop iterations are divided into pieces of size chunk. When a thread finishes one chunk, it is dynamically assigned another. $!OMP DO SCHEDULE(GUIDED,n) // n is chunk size Similar to DYNAMIC but chunk size is relative to number of iterations left. Keep in mind: although Dynamic scheduling might be the prefered choice to prevent load inbalance in some situations, there is a significant overhead involved compared to static scheduling. NOTE: example dynamic_schedule, vary threads
36 OMP SINGLE Another work sharing directive (although it doesn't really share work) OpenMP provides is!$omp SINGLE. When encountering a single directive only one member of the team will execute the code in the block One thread (not neccesarily master) executes the block Other threads will wait Useful for thread-unsafe code Useful for I/O operations We will use this directive in a later exercise
37 Data Dependencies Not all loops can be parallelized. Before adding OpenMP directives need to check for any dependencies: We categorize three types of dependencies: Flow dependence: Read after Write (RAW) Anti dependence: Write after Read (WAR) Output dependence (Write after Write (WAW) FLOW ANTI OUTPUT X = 21 PRINT *, X PRINT *, X X = 21 X = 21 X = 21
38 Data Dependencies (2) For our purpose (openmp parallel loops) we only care about loop carried dependencies (dependencies between instructions in different iterations of the loop) Let's find the dependencies in the following loop? S1: DO I=1,10 S2: B(i) = temp S3: A(i+1) = B(i+1) S4: temp = A(i) S5: ENDDO
39 Data Dependencies (2) For our purpose (openmp parallel loops) we only care about loop carried dependencies (dependencies between instructions in different iterations of the loop) What are the dependencies in the following loop? S1: DO I=1,10 S2: B(i) = temp S3: A(i+1) = B(i+1) S4: temp = A(i) S5: ENDDO 1: S3 S2 anti (B)
40 Data Dependencies (2) For our purpose (openmp parallel loops) we only care about loop carried dependencies (dependencies between instructions in different iterations of the loop) What are the dependencies in the following loop? S1: DO I=1,10 S2: B(i) = temp S3: A(i+1) = B(i+1) S4: temp = A(i) S5: ENDDO 1: S3 S2 anti (B) 2: S3 S4 flow (A)
41 Data Dependencies (2) For our purpose (openmp parallel loops) we only care about loop carried dependencies (dependencies between instructions in different iterations of the loop) What are the dependencies in the following loop? S1: DO I=1,10 S2: B(i) = temp S3: A(i+1) = B(i+1) S4: temp = A(i) S5: ENDDO 1: S3 S2 anti (B) 2: S3 S4 flow (A) 3: S4 S2 flow (temp)
42 Data Dependencies (2) For our purpose (openmp parallel loops) we only care about loop carried dependencies (dependencies between instructions in different iterations of the loop) What are the dependencies in the following loop? S1: DO I=1,10 S2: B(i) = temp S3: A(i+1) = B(i+1) S4: temp = A(i) S5: ENDDO 1: S3 S2 anti (B) 2: S3 S4 flow (A) 3: S4 S2 flow (temp) 4: S4 S4 output (temp)
43 Data Dependencies (2) For our purpose (openmp parallel loops) we only care about loop carried dependencies (dependencies between instructions in different iterations of the loop) What are the dependencies in the following loop? S1: DO I=1,10 S2: B(i) = temp S3: A(i+1) = B(i+1) S4: temp = A(i) S5: ENDDO 1: S3 S2 anti (B) 2: S3 S4 flow (A) 3: S4 S2 flow (temp) 4: S4 S4 output (temp) Sometimes it helps to unroll part of the loop to see loop carried dependencies more clear S2: B(1) = temp S3: A(2) = B(2) S4: temp = A(1) S2: B(2) = temp S3: A(3) = B(3) S4: temp = A(2)
44 Data Dependencies (2) For our purpose (openmp parallel loops) we only care about loop carried dependencies (dependencies between instructions in different iterations of the loop) What are the dependencies in the following loop? S1: DO I=1,10 S2: B(i) = temp S3: A(i+1) = B(i+1) S4: temp = A(i) S5: ENDDO Sometimes it helps to unroll part of the loop to see loop carried dependencies more clear S2: B(1) = temp S3: A(2) = B(2) S4: temp = A(1) S2: B(2) = temp S3: A(3) = B(3) S4: temp = A(2) 1 1: S3 S2 anti (B) 2: S3 S4 flow (A) 3: S4 S2 flow (temp) 4: S4 S4 output (temp)
45 Case Study: Jacobi Implement a parallel version of the Jacobi algorithm using OpenMP. A sequential version is provided.
46 Data Dependencies (3) Loop carried anti- and output dependencies are not true dependencies (re-use of the same name) and in many cases can be resolved relatively easily. Flow dependencies are true dependencies (there is a flow from definition to its use) and in many cases cannot be removed easily. Might require rewriting the algorithm (if possible)
47 Resolving Anti/Output Deps Use PRIVATE clause: Already saw this in example hello_threads Rename variables (if possible): Example: in-place left shift!$omp PARALLEL DO DO i=1,n-1 DO i=1,n-1 DO i=1,n-1 A(i)=A(i+1) ANEW(i) = A(i+1) ANEW(i) = A(i+1) ENDDO ENDDO ENDDO!$OMP END PARALLEL DO If has to be in-place can do it in two steps:!$omp PARALLEL!$OMP DO T(i) = A(i+1)!$OMP END DO!$OMP DO A(i) = T(i)!$OMP END DO!$OMP END PARALLEL
48 More about shared/private vars Besides the clauses described before OpenMP provides some additional datascope clauses that are very useful: FIRSTPRIVATE ( list ): Same as PRIVATE but every private copy of variable 'x' will be initialized with the original value (before the omp region started) of 'x' LASTPRIVATE ( list ): Same as PRIVATE but the private copies of the variables in list from the last work sharing will be copied to shared version. To be used with!$omp DO Directive. DEFAULT (SHARED PRIVATE FIRSTPRIVATE LASTPRIVATE ): Specifies the default scope for all variables in omp region. NOTE: example data scope
49 Case Study: Removing Flow Deps Y = prefix(x) Y(1) = X(1); Y(i) = Y(i-1) + X(i) X Y SEQUENTIAL Y[1] = X[1] DO i=2,n,1 Y[i] = Y[i-1] + X[i] ENDDO
50 Case Study: Removing Flow Deps Y = prefix(x) Y(1) = X(1); Y(i) = Y(i-1) + X(i) X Y SEQUENTIAL Y[1] = X[1] DO i=2,n,1 Y[i] = Y[i-1] + X[i] ENDDO PARALLEL Y[1] = X[1]!$OMP PARALLEL DO DO i=2,n,1 Y[i] = Y[i-1] + X[i] ENDDO!$OMP END PARALLEL DO
51 Case Study: Removing Flow Deps Y = prefix(x) Y(1) = X(1); Y(i) = Y(i-1) + X(i) X Y SEQUENTIAL Y[1] = X[1] DO i=2,n,1 Y[i] = Y[i-1] + X[i] ENDDO WHY? PARALLEL Y[1] = X[1]!$OMP PARALLEL DO DO i=2,n,1 Y[i] = Y[i-1] + X[i] ENDDO!$OMP END PARALLEL DO
52 Case Study: Removing Flow Deps REWRITE ALGORITHM STEP 1: split X among threads; every thread computes its own (partial) prefix sum STEP 2: create array T T[1]=0, T[i] = X[(length/threads)*(i-1)], perform simple prefix sum on T (will collects last element from every thread (except last) and perform simple prefix sum) STEP 3: every thread adds T[theadid] to all its element STEP 4: Finished; we rewrote prefex sum by removing dependencies.
53 Prefix Sum Implementation How to implement the algorithm on the previous slide? Three separate steps Steps 1 and 3 can be done in parallel Step 2 has to be done sequential Step 1 has to be performed before step 2 Step 2 has to be performed before step 3 NOTE: For illustration purposes we can assume array length is multiple of #threads NOTE: exercise prefix
54 Case Study: Removing Flow Deps This Case study showed an example of an algorithm with real (flow) dependencies Sometimes we can rewrite algorightm to run parallel Most of the time this is not trivial Speedup much less impressive (often)
55 OpenMP Sections Suppose you have blocks of code that can be executed in parallel (i.e. No dependencies). To execute them in parallel OpenMP provides the!$omp SECTIONS directive. The syntax will look something like:!$omp PARALLEL!$OMP SECTIONS!$OMP SECTION // WORK 1!$OMP SECTION // WORK 2!$OMP END SECTIONS!$OMP END PARALLEL Combined version!$omp PARALLEL SECTIONS!$OMP SECTION // WORK 1!$OMP SECTION // WORK 2!$OMP END PARALLEL SECTIONS This will execute WORK 1 and WORK 2 in parallel
56 Exercise Create a program that computes the adjusted prefix sum below for 4 different arrays and after that adds all of them up. Use OpenMP directives to make it run in parallel. A(1) = A(1) A(2) = A(2) + A(1) A(i) = A(i-2) + A(i-1)
57 NOWAIT Clause Whenever a thread in a work sharing construct (e.g.!$omp DO ) finishes its work faster than other threads it will wait until all threads participating have finished their respective work. All threads will synchronize at end of work sharing construct For situations where we don't need or want to synchronize at the end OpenMP provides the NOWAIT clause Fortran!$OMP DO :!$OMP END DO NOWAIT C/C++ #pragma omp do nowait { : } NOTE: example nowait
58 Work Sharing Summary OMP work sharing constructions we discussed!$omp DO!$OMP SECTIONS!$OMP SINGLE Useful clauses that can be used with these constructs ( incomplete list and not all clauses can be used with every directive) SHARED (list) PRIVATE (list) FIRSTPRIVATE (list) LASTPRIVATE(list) SCHEDULE (STATIC DYNAMIC GUIDED, chunk) REDUCTION(op:list) NOWAIT
59 Synchronization OpenMP programs use shared variables to communicate. We need to make sure these variables are not accessed at the same time by different threads (will cause race conditions, WHY?). OpenMP provides a number of directives for synchronization.!$omp MASTER!$OMP CRITICAL!$OMP ATOMIC!$OMP BARRIER
60 !$OMP MASTER This Directive ensures that only the master threads excecutes instructions in the block. There is no implicit barrier so other threads will not wait for master to finish
61 !$OMP MASTER This Directive ensures that only the master threads excecutes instructions in the block. There is no implicit barrier so other threads will not wait for master to finish What is difference with!$omp SINGLE DIRECTIVE?
62 !$OMP CRITICAL This Directive makes sure that only one thread can execute the code in the block. If another threads reaches the critical section it will wait untill the current thread finishes this critical section. Every thread will execute the critical block and they will synchronize at end of critical section Introduces overhead Serializes critical block If time in critical block relatively large speedup negligible
63 Exercise In the REDUCTION exercise we created a program that computes the sum of all the elements in an array A. Create another program that does the same, without using the REDUCE clause. Compare the two versions.
64 !$OMP ATOMIC This Directive is very similar to the!$omp CRITICAL directive on the previous slide. Difference is that!$omp ATOMIC is only used for the update of a memory location. Sometimes!$OMP ATOMIC is also refered to as a mini critical section. Block consists of only one statement Atomic statment must follow specific syntax
65 !$OMP ATOMIC This Directive is very similar to the!$omp CRITICAL directive on the previous slide. Difference is that!$omp ATOMIC is only used for the update of a memory location. Sometimes!$OMP ATOMIC is also refered to as a mini critical section. Block consists of only one statement Atomic statment must follow specific syntax Can replace critical with atomic in previous example
66 !$OMP BARRIER!$OMP BARRIER will enforce every thread to wait at the barrier until all threads have reached the barrier.!$omp BARRIER is probably the most well known synchronization mechanism; explicitly or implictly. The following omp directives we discussed before include an implicit barrier:!$ OMP END PARALLEL!$ OMP END DO!$ OMP END SECTIONS!$ OMP END SINGLE!$ OMP END CRITICAL
67 Potential Speedup Ideally, we would like to have perfect speedup (i.e. speedup of N when using N processors). However, this is not really feasible in most cases for the following reasons: Not all execution time is spent in parallel regions (e.g. loops) e.g. not all loops are parallel (data dependencies) There is an inherent overhead with using openmp threads Let's look at an example that shows how speedup will be affected because of non parallel parts of a program NOTE: example amdahl
68 TIP: IF Clause OpenMP provides another useful clause to decide at run time if a parallel region should actually be run in parallel (multiple threads) or just by the master thread: For example: IF (logical expr) $!OMP PARALLEL IF(n > ) #pragma omp parallel if (n>100000) (fortran) (C/C++) This will only run the parallel region when n>
69 Amdahl's Law Every program consists of two parts: Sequential part Parallel part Obviously, no matter how many processors, the sequential part will always be executed by exactly one processor.suppose, program spends p (0 < p < 1) part of the time in parallel region. running time (relative to sequential) will be: (1 p)+ p N This means that maximum speedup will be: 1 1 (1 p)+ p N e.g. Suppose 80% of program can be run in parallel and we have unlimited #cpus, maximum speedup will still be only 5
70 OpenMP overhead/scalability Starting a parallel OpenMP region does not come free. There is considerable overhead involved. Consider the following before placing openmp pragmas around a loop: Remember Amdahl's law Parallelize most outer loop possible (in some cases even if less iterations) Make sure speedup in parallel region enough to overcome overhead Is number if iterations in loop large enough? Is amount of work per iteration enough? Overhead can be different on different machine/os/compiler OpenMP programs don't always scale well. I.e. When number of openmp threads increases speedup will suffer More threads competing for available bandwith Cache issues NOTE: example omp_overhead and scalabiltiy
71 Nested Parallelism OpenMP allows nested parallelism (e.g.!$omp DO within!$omp DO) env var OMP_NESTED to enable/disable omp_get_nested(), omp_set_nested() runtime functions Compiler can still choose to serialize nested parallel region (i.e. use team with only one thread) Significant overhead. WHY? Can cause additional load imbalance. WHY? NOTE: example nested
72 OpenMP Loop collapsing When you have perfectly nested loops you can collapse inner loops using the OpenMP clause collapse(n). Collapsing a loop: Example: Loop needs to be perfectly nested Loop needs to have rectangular iteration space Makes iteration space larger Less synchronization needed than nested parallel loops!$omp PARALLEL DO PRIVATE (i,j) COLLAPSE(2) DO i = 1,2 DO j=1,2 call foo(a,i,j) ENDDO ENDDO!$OMP END PARALLEL DO NOTE: example collapse
73 TIP: Number of Threads Used OpenMP has two modes to determine how many threads will actually be used in parallel region: DYNAMIC MODE Number of threads used can vary per parallel region Setting number of threads only sets max number of threads (actual number might be less) STATIC MODE Number of threads is fixed and determined by programmer Environmental Variable OMP_DYNAMIC to set mode Runtime functions omp_get_dynamic/omp_set_dynamic
74 Math Libraries Math libraries have very specialized and optimized version of many functions and many of them have been parallelized using OpenMP. On EOS we have the Intel Math Kernel Library (MKL) For more information about MKL: So, before implementing your own OpenMP Math function, check if there already is a version in MKL
Parallel Computing. Shared memory parallel programming with OpenMP
Parallel Computing Shared memory parallel programming with OpenMP Thorsten Grahs, 27.04.2015 Table of contents Introduction Directives Scope of data Synchronization 27.04.2015 Thorsten Grahs Parallel Computing
OpenMP & MPI CISC 879. Tristan Vanderbruggen & John Cavazos Dept of Computer & Information Sciences University of Delaware
OpenMP & MPI CISC 879 Tristan Vanderbruggen & John Cavazos Dept of Computer & Information Sciences University of Delaware 1 Lecture Overview Introduction OpenMP MPI Model Language extension: directives-based
Parallel Computing. Parallel shared memory computing with OpenMP
Parallel Computing Parallel shared memory computing with OpenMP Thorsten Grahs, 14.07.2014 Table of contents Introduction Directives Scope of data Synchronization OpenMP vs. MPI OpenMP & MPI 14.07.2014
Introduction to OpenMP Programming. NERSC Staff
Introduction to OpenMP Programming NERSC Staff Agenda Basic informa,on An selec(ve introduc(on to the programming model. Direc(ves for work paralleliza(on and synchroniza(on. Some hints on usage Hands-
High Performance Computing
High Performance Computing Oliver Rheinbach [email protected] http://www.mathe.tu-freiberg.de/nmo/ Vorlesung Introduction to High Performance Computing Hörergruppen Woche Tag Zeit Raum
Objectives. Overview of OpenMP. Structured blocks. Variable scope, work-sharing. Scheduling, synchronization
OpenMP Objectives Overview of OpenMP Structured blocks Variable scope, work-sharing Scheduling, synchronization 1 Overview of OpenMP OpenMP is a collection of compiler directives and library functions
An Introduction to Parallel Programming with OpenMP
An Introduction to Parallel Programming with OpenMP by Alina Kiessling E U N I V E R S I H T T Y O H F G R E D I N B U A Pedagogical Seminar April 2009 ii Contents 1 Parallel Programming with OpenMP 1
Parallel Algorithm Engineering
Parallel Algorithm Engineering Kenneth S. Bøgh PhD Fellow Based on slides by Darius Sidlauskas Outline Background Current multicore architectures UMA vs NUMA The openmp framework Examples Software crisis
OpenMP C and C++ Application Program Interface
OpenMP C and C++ Application Program Interface Version.0 March 00 Copyright 1-00 OpenMP Architecture Review Board. Permission to copy without fee all or part of this material is granted, provided the OpenMP
OpenACC 2.0 and the PGI Accelerator Compilers
OpenACC 2.0 and the PGI Accelerator Compilers Michael Wolfe The Portland Group [email protected] This presentation discusses the additions made to the OpenACC API in Version 2.0. I will also present
#pragma omp critical x = x + 1; !$OMP CRITICAL X = X + 1!$OMP END CRITICAL. (Very inefficiant) example using critical instead of reduction:
omp critical The code inside a CRITICAL region is executed by only one thread at a time. The order is not specified. This means that if a thread is currently executing inside a CRITICAL region and another
Getting OpenMP Up To Speed
1 Getting OpenMP Up To Speed Ruud van der Pas Senior Staff Engineer Oracle Solaris Studio Oracle Menlo Park, CA, USA IWOMP 2010 CCS, University of Tsukuba Tsukuba, Japan June 14-16, 2010 2 Outline The
COMP/CS 605: Introduction to Parallel Computing Lecture 21: Shared Memory Programming with OpenMP
COMP/CS 605: Introduction to Parallel Computing Lecture 21: Shared Memory Programming with OpenMP Mary Thomas Department of Computer Science Computational Science Research Center (CSRC) San Diego State
OpenMP Application Program Interface
OpenMP Application Program Interface Version.1 July 0 Copyright 1-0 OpenMP Architecture Review Board. Permission to copy without fee all or part of this material is granted, provided the OpenMP Architecture
A Comparison Of Shared Memory Parallel Programming Models. Jace A Mogill David Haglin
A Comparison Of Shared Memory Parallel Programming Models Jace A Mogill David Haglin 1 Parallel Programming Gap Not many innovations... Memory semantics unchanged for over 50 years 2010 Multi-Core x86
OpenACC Programming and Best Practices Guide
OpenACC Programming and Best Practices Guide June 2015 2015 openacc-standard.org. All Rights Reserved. Contents 1 Introduction 3 Writing Portable Code........................................... 3 What
A Pattern-Based Comparison of OpenACC & OpenMP for Accelerators
A Pattern-Based Comparison of OpenACC & OpenMP for Accelerators Sandra Wienke 1,2, Christian Terboven 1,2, James C. Beyer 3, Matthias S. Müller 1,2 1 IT Center, RWTH Aachen University 2 JARA-HPC, Aachen
OpenMP* 4.0 for HPC in a Nutshell
OpenMP* 4.0 for HPC in a Nutshell Dr.-Ing. Michael Klemm Senior Application Engineer Software and Services Group ([email protected]) *Other brands and names are the property of their respective owners.
MPI and Hybrid Programming Models. William Gropp www.cs.illinois.edu/~wgropp
MPI and Hybrid Programming Models William Gropp www.cs.illinois.edu/~wgropp 2 What is a Hybrid Model? Combination of several parallel programming models in the same program May be mixed in the same source
An Introduction to Parallel Computing/ Programming
An Introduction to Parallel Computing/ Programming Vicky Papadopoulou Lesta Astrophysics and High Performance Computing Research Group (http://ahpc.euc.ac.cy) Dep. of Computer Science and Engineering European
Multi-Threading Performance on Commodity Multi-Core Processors
Multi-Threading Performance on Commodity Multi-Core Processors Jie Chen and William Watson III Scientific Computing Group Jefferson Lab 12000 Jefferson Ave. Newport News, VA 23606 Organization Introduction
Practical Introduction to
1 Practical Introduction to http://tinyurl.com/cq-intro-openmp-20151006 By: Bart Oldeman, Calcul Québec McGill HPC [email protected], [email protected] Partners and Sponsors 2 3 Outline
Multi-core Programming System Overview
Multi-core Programming System Overview Based on slides from Intel Software College and Multi-Core Programming increasing performance through software multi-threading by Shameem Akhter and Jason Roberts,
Parallel Programming for Multi-Core, Distributed Systems, and GPUs Exercises
Parallel Programming for Multi-Core, Distributed Systems, and GPUs Exercises Pierre-Yves Taunay Research Computing and Cyberinfrastructure 224A Computer Building The Pennsylvania State University University
Spring 2011 Prof. Hyesoon Kim
Spring 2011 Prof. Hyesoon Kim Today, we will study typical patterns of parallel programming This is just one of the ways. Materials are based on a book by Timothy. Decompose Into tasks Original Problem
Chapter 12: Multiprocessor Architectures. Lesson 01: Performance characteristics of Multiprocessor Architectures and Speedup
Chapter 12: Multiprocessor Architectures Lesson 01: Performance characteristics of Multiprocessor Architectures and Speedup Objective Be familiar with basic multiprocessor architectures and be able to
Towards OpenMP Support in LLVM
Towards OpenMP Support in LLVM Alexey Bataev, Andrey Bokhanko, James Cownie Intel 1 Agenda What is the OpenMP * language? Who Can Benefit from the OpenMP language? OpenMP Language Support Early / Late
OpenACC Basics Directive-based GPGPU Programming
OpenACC Basics Directive-based GPGPU Programming Sandra Wienke, M.Sc. [email protected] Center for Computing and Communication RWTH Aachen University Rechen- und Kommunikationszentrum (RZ) PPCES,
Using the Intel Inspector XE
Using the Dirk Schmidl [email protected] Rechen- und Kommunikationszentrum (RZ) Race Condition Data Race: the typical OpenMP programming error, when: two or more threads access the same memory
Elemental functions: Writing data-parallel code in C/C++ using Intel Cilk Plus
Elemental functions: Writing data-parallel code in C/C++ using Intel Cilk Plus A simple C/C++ language extension construct for data parallel operations Robert Geva [email protected] Introduction Intel
Programming the Intel Xeon Phi Coprocessor
Programming the Intel Xeon Phi Coprocessor Tim Cramer [email protected] Rechen- und Kommunikationszentrum (RZ) Agenda Motivation Many Integrated Core (MIC) Architecture Programming Models Native
Multicore Parallel Computing with OpenMP
Multicore Parallel Computing with OpenMP Tan Chee Chiang (SVU/Academic Computing, Computer Centre) 1. OpenMP Programming The death of OpenMP was anticipated when cluster systems rapidly replaced large
What is Multi Core Architecture?
What is Multi Core Architecture? When a processor has more than one core to execute all the necessary functions of a computer, it s processor is known to be a multi core architecture. In other words, a
INTEL PARALLEL STUDIO EVALUATION GUIDE. Intel Cilk Plus: A Simple Path to Parallelism
Intel Cilk Plus: A Simple Path to Parallelism Compiler extensions to simplify task and data parallelism Intel Cilk Plus adds simple language extensions to express data and task parallelism to the C and
Workshare Process of Thread Programming and MPI Model on Multicore Architecture
Vol., No. 7, 011 Workshare Process of Thread Programming and MPI Model on Multicore Architecture R. Refianti 1, A.B. Mutiara, D.T Hasta 3 Faculty of Computer Science and Information Technology, Gunadarma
Performance Evaluation and Optimization of A Custom Native Linux Threads Library
Center for Embedded Computer Systems University of California, Irvine Performance Evaluation and Optimization of A Custom Native Linux Threads Library Guantao Liu and Rainer Dömer Technical Report CECS-12-11
FPGA area allocation for parallel C applications
1 FPGA area allocation for parallel C applications Vlad-Mihai Sima, Elena Moscu Panainte, Koen Bertels Computer Engineering Faculty of Electrical Engineering, Mathematics and Computer Science Delft University
reduction critical_section
A comparison of OpenMP and MPI for the parallel CFD test case Michael Resch, Bjíorn Sander and Isabel Loebich High Performance Computing Center Stuttgart èhlrsè Allmandring 3, D-755 Stuttgart Germany [email protected]
Chapter 2 Parallel Architecture, Software And Performance
Chapter 2 Parallel Architecture, Software And Performance UCSB CS140, T. Yang, 2014 Modified from texbook slides Roadmap Parallel hardware Parallel software Input and output Performance Parallel program
University of Amsterdam - SURFsara. High Performance Computing and Big Data Course
University of Amsterdam - SURFsara High Performance Computing and Big Data Course Workshop 7: OpenMP and MPI Assignments Clemens Grelck [email protected] Roy Bakker [email protected] Adam Belloum [email protected]
HPC Wales Skills Academy Course Catalogue 2015
HPC Wales Skills Academy Course Catalogue 2015 Overview The HPC Wales Skills Academy provides a variety of courses and workshops aimed at building skills in High Performance Computing (HPC). Our courses
The OpenACC Application Programming Interface
The OpenACC Application Programming Interface Version 1.0 November, 2011 Contents 1. Introduction... 4 1.1 Scope... 4 1.2 Execution Model... 4 1.3 Memory Model... 5 1.4 Organization of this document...
SLURM Workload Manager
SLURM Workload Manager What is SLURM? SLURM (Simple Linux Utility for Resource Management) is the native scheduler software that runs on ASTI's HPC cluster. Free and open-source job scheduler for the Linux
Parallelization: Binary Tree Traversal
By Aaron Weeden and Patrick Royal Shodor Education Foundation, Inc. August 2012 Introduction: According to Moore s law, the number of transistors on a computer chip doubles roughly every two years. First
Performance Evaluation of NAS Parallel Benchmarks on Intel Xeon Phi
Performance Evaluation of NAS Parallel Benchmarks on Intel Xeon Phi ICPP 6 th International Workshop on Parallel Programming Models and Systems Software for High-End Computing October 1, 2013 Lyon, France
Benchmark Hadoop and Mars: MapReduce on cluster versus on GPU
Benchmark Hadoop and Mars: MapReduce on cluster versus on GPU Heshan Li, Shaopeng Wang The Johns Hopkins University 3400 N. Charles Street Baltimore, Maryland 21218 {heshanli, shaopeng}@cs.jhu.edu 1 Overview
Evaluation of CUDA Fortran for the CFD code Strukti
Evaluation of CUDA Fortran for the CFD code Strukti Practical term report from Stephan Soller High performance computing center Stuttgart 1 Stuttgart Media University 2 High performance computing center
PROACTIVE BOTTLENECK PERFORMANCE ANALYSIS IN PARALLEL COMPUTING USING OPENMP
PROACTIVE BOTTLENECK PERFORMANCE ANALYSIS IN PARALLEL COMPUTING USING OPENMP Vibha Rajput Computer Science and Engineering M.Tech.2 nd Sem (CSE) Indraprastha Engineering College. M. T.U Noida, U.P., India
LOAD BALANCING DISTRIBUTED OPERATING SYSTEMS, SCALABILITY, SS 2015. Hermann Härtig
LOAD BALANCING DISTRIBUTED OPERATING SYSTEMS, SCALABILITY, SS 2015 Hermann Härtig ISSUES starting points independent Unix processes and block synchronous execution who does it load migration mechanism
Intro to GPU computing. Spring 2015 Mark Silberstein, 048661, Technion 1
Intro to GPU computing Spring 2015 Mark Silberstein, 048661, Technion 1 Serial vs. parallel program One instruction at a time Multiple instructions in parallel Spring 2015 Mark Silberstein, 048661, Technion
<Insert Picture Here> An Experimental Model to Analyze OpenMP Applications for System Utilization
An Experimental Model to Analyze OpenMP Applications for System Utilization Mark Woodyard Principal Software Engineer 1 The following is an overview of a research project. It is intended
COMPUTER ORGANIZATION ARCHITECTURES FOR EMBEDDED COMPUTING
COMPUTER ORGANIZATION ARCHITECTURES FOR EMBEDDED COMPUTING 2013/2014 1 st Semester Sample Exam January 2014 Duration: 2h00 - No extra material allowed. This includes notes, scratch paper, calculator, etc.
Tools Page 1 of 13 ON PROGRAM TRANSLATION. A priori, we have two translation mechanisms available:
Tools Page 1 of 13 ON PROGRAM TRANSLATION A priori, we have two translation mechanisms available: Interpretation Compilation On interpretation: Statements are translated one at a time and executed immediately.
OpenMP and Performance
Dirk Schmidl IT Center, RWTH Aachen University Member of the HPC Group [email protected] IT Center der RWTH Aachen University Tuning Cycle Performance Tuning aims to improve the runtime of an
MAQAO Performance Analysis and Optimization Tool
MAQAO Performance Analysis and Optimization Tool Andres S. CHARIF-RUBIAL [email protected] Performance Evaluation Team, University of Versailles S-Q-Y http://www.maqao.org VI-HPS 18 th Grenoble 18/22
Petascale Software Challenges. William Gropp www.cs.illinois.edu/~wgropp
Petascale Software Challenges William Gropp www.cs.illinois.edu/~wgropp Petascale Software Challenges Why should you care? What are they? Which are different from non-petascale? What has changed since
An Implementation Of Multiprocessor Linux
An Implementation Of Multiprocessor Linux This document describes the implementation of a simple SMP Linux kernel extension and how to use this to develop SMP Linux kernels for architectures other than
Cost Model: Work, Span and Parallelism. 1 The RAM model for sequential computation:
CSE341T 08/31/2015 Lecture 3 Cost Model: Work, Span and Parallelism In this lecture, we will look at how one analyze a parallel program written using Cilk Plus. When we analyze the cost of an algorithm
Case Study on Productivity and Performance of GPGPUs
Case Study on Productivity and Performance of GPGPUs Sandra Wienke [email protected] ZKI Arbeitskreis Supercomputing April 2012 Rechen- und Kommunikationszentrum (RZ) RWTH GPU-Cluster 56 Nvidia
IA-64 Application Developer s Architecture Guide
IA-64 Application Developer s Architecture Guide The IA-64 architecture was designed to overcome the performance limitations of today s architectures and provide maximum headroom for the future. To achieve
2: Computer Performance
2: Computer Performance http://people.sc.fsu.edu/ jburkardt/presentations/ fdi 2008 lecture2.pdf... John Information Technology Department Virginia Tech... FDI Summer Track V: Parallel Programming 10-12
Parallel Ray Tracing using MPI: A Dynamic Load-balancing Approach
Parallel Ray Tracing using MPI: A Dynamic Load-balancing Approach S. M. Ashraful Kadir 1 and Tazrian Khan 2 1 Scientific Computing, Royal Institute of Technology (KTH), Stockholm, Sweden [email protected],
Parallel Scalable Algorithms- Performance Parameters
www.bsc.es Parallel Scalable Algorithms- Performance Parameters Vassil Alexandrov, ICREA - Barcelona Supercomputing Center, Spain Overview Sources of Overhead in Parallel Programs Performance Metrics for
Introduction to CUDA C
Introduction to CUDA C What is CUDA? CUDA Architecture Expose general-purpose GPU computing as first-class capability Retain traditional DirectX/OpenGL graphics performance CUDA C Based on industry-standard
OpenACC Parallelization and Optimization of NAS Parallel Benchmarks
OpenACC Parallelization and Optimization of NAS Parallel Benchmarks Presented by Rengan Xu GTC 2014, S4340 03/26/2014 Rengan Xu, Xiaonan Tian, Sunita Chandrasekaran, Yonghong Yan, Barbara Chapman HPC Tools
Introduction to Cloud Computing
Introduction to Cloud Computing Parallel Processing I 15 319, spring 2010 7 th Lecture, Feb 2 nd Majd F. Sakr Lecture Motivation Concurrency and why? Different flavors of parallel computing Get the basic
RevoScaleR Speed and Scalability
EXECUTIVE WHITE PAPER RevoScaleR Speed and Scalability By Lee Edlefsen Ph.D., Chief Scientist, Revolution Analytics Abstract RevoScaleR, the Big Data predictive analytics library included with Revolution
Scalability evaluation of barrier algorithms for OpenMP
Scalability evaluation of barrier algorithms for OpenMP Ramachandra Nanjegowda, Oscar Hernandez, Barbara Chapman and Haoqiang H. Jin High Performance Computing and Tools Group (HPCTools) Computer Science
OpenCL for programming shared memory multicore CPUs
Akhtar Ali, Usman Dastgeer and Christoph Kessler. OpenCL on shared memory multicore CPUs. Proc. MULTIPROG-212 Workshop at HiPEAC-212, Paris, Jan. 212. OpenCL for programming shared memory multicore CPUs
OpenMP Programming on ScaleMP
OpenMP Programming on ScaleMP Dirk Schmidl [email protected] Rechen- und Kommunikationszentrum (RZ) MPI vs. OpenMP MPI distributed address space explicit message passing typically code redesign
Multi-GPU Load Balancing for Simulation and Rendering
Multi- Load Balancing for Simulation and Rendering Yong Cao Computer Science Department, Virginia Tech, USA In-situ ualization and ual Analytics Instant visualization and interaction of computing tasks
Debugging with TotalView
Tim Cramer 17.03.2015 IT Center der RWTH Aachen University Why to use a Debugger? If your program goes haywire, you may... ( wand (... buy a magic... read the source code again and again and...... enrich
5x in 5 hours Porting SEISMIC_CPML using the PGI Accelerator Model
5x in 5 hours Porting SEISMIC_CPML using the PGI Accelerator Model C99, C++, F2003 Compilers Optimizing Vectorizing Parallelizing Graphical parallel tools PGDBG debugger PGPROF profiler Intel, AMD, NVIDIA
Scheduling Task Parallelism" on Multi-Socket Multicore Systems"
Scheduling Task Parallelism" on Multi-Socket Multicore Systems" Stephen Olivier, UNC Chapel Hill Allan Porterfield, RENCI Kyle Wheeler, Sandia National Labs Jan Prins, UNC Chapel Hill Outline" Introduction
Hybrid Programming with MPI and OpenMP
Hybrid Programming with and OpenMP Ricardo Rocha and Fernando Silva Computer Science Department Faculty of Sciences University of Porto Parallel Computing 2015/2016 R. Rocha and F. Silva (DCC-FCUP) Programming
An Incomplete C++ Primer. University of Wyoming MA 5310
An Incomplete C++ Primer University of Wyoming MA 5310 Professor Craig C. Douglas http://www.mgnet.org/~douglas/classes/na-sc/notes/c++primer.pdf C++ is a legacy programming language, as is other languages
NAND Flash Memories. Understanding NAND Flash Factory Pre-Programming. Schemes
NAND Flash Memories Understanding NAND Flash Factory Pre-Programming Schemes Application Note February 2009 an_elnec_nand_schemes, version 1.00 Version 1.00/02.2009 Page 1 of 20 NAND flash technology enables
OLCF Best Practices. Bill Renaud OLCF User Assistance Group
OLCF Best Practices Bill Renaud OLCF User Assistance Group Overview This presentation covers some helpful information for users of OLCF Staying informed Some aspects of system usage that may differ from
Parallel Databases. Parallel Architectures. Parallelism Terminology 1/4/2015. Increase performance by performing operations in parallel
Parallel Databases Increase performance by performing operations in parallel Parallel Architectures Shared memory Shared disk Shared nothing closely coupled loosely coupled Parallelism Terminology Speedup:
Distributed R for Big Data
Distributed R for Big Data Indrajit Roy HP Vertica Development Team Abstract Distributed R simplifies large-scale analysis. It extends R. R is a single-threaded environment which limits its utility for
Designing and Building Applications for Extreme Scale Systems CS598 William Gropp www.cs.illinois.edu/~wgropp
Designing and Building Applications for Extreme Scale Systems CS598 William Gropp www.cs.illinois.edu/~wgropp Welcome! Who am I? William (Bill) Gropp Professor of Computer Science One of the Creators of
Parallel Computing for Data Science
Parallel Computing for Data Science With Examples in R, C++ and CUDA Norman Matloff University of California, Davis USA (g) CRC Press Taylor & Francis Group Boca Raton London New York CRC Press is an imprint
Overlapping Data Transfer With Application Execution on Clusters
Overlapping Data Transfer With Application Execution on Clusters Karen L. Reid and Michael Stumm [email protected] [email protected] Department of Computer Science Department of Electrical and Computer
22S:295 Seminar in Applied Statistics High Performance Computing in Statistics
22S:295 Seminar in Applied Statistics High Performance Computing in Statistics Luke Tierney Department of Statistics & Actuarial Science University of Iowa August 30, 2007 Luke Tierney (U. of Iowa) HPC
The ConTract Model. Helmut Wächter, Andreas Reuter. November 9, 1999
The ConTract Model Helmut Wächter, Andreas Reuter November 9, 1999 Overview In Ahmed K. Elmagarmid: Database Transaction Models for Advanced Applications First in Andreas Reuter: ConTracts: A Means for
Introduction to Linux and Cluster Basics for the CCR General Computing Cluster
Introduction to Linux and Cluster Basics for the CCR General Computing Cluster Cynthia Cornelius Center for Computational Research University at Buffalo, SUNY 701 Ellicott St Buffalo, NY 14203 Phone: 716-881-8959
