Lecture 11

SFR1811·2022년 2월 4일

5.9 Termination Syncronization

communication between threads must be as short as possible.

thread terminates when

  1. finishes normally
  2. finishes with an error
  3. killed by parent/sibling - not in uC++
  4. parent terminated - not in uC++

5.10 Divide and Conquer

Any divide and conquer problems are embarrassingly parallel.
It only requires termination syncronization at the end.

example program - adds all numbers in matrix

#include <uCobegin.h>
int main(){
  const int rows = 10, col = 10;
  int matrix[rows][cols], subtotals[rows], total = 0;
  // read matrix
  COFOR(r, 0, rows, // like for(int r=0;r<rows;r++){
    subtotals[r] = 0;
    for(int c=0; c<cols; c++){
    	subtotals[r] += matrix[r][c];
    }
  );// waits for threads to finish
  
  // do syncronous addup to subtotals
  for(int r=0; r<rows; r++){
    total += subtotals[r];
  }
  cout << total << endl;
}

This is implicit because COBEGIN is implicit and COFOR is built on COBEGIN

Actor example of same program

_Actor Adder{
  int * row, cols, & subtotal;
  Allocation receive(Message &){
    subtotal = 0;
    for(int c=0;c<cols;c++) subtotal += rows[c];
    return Delete;
  }
 public:
  Adder(int row[], int cols, int &subtotal):
    row(row), cols(cols), subtotal(subtotal){}
};

int main(){
  ...
  uActorStart(); // start actor system
  for(int r=0; r<rows,; r++){
    *new Adder(matrix[r],cols,subtotals[r]) | uActor::startMsg;
  }
  uActorStop();
  ...  
}

Task example

_Task Adder {
  int * row, cols, &subtotal; // communication
  void main() {
    subtotal = 0;
    for ( int c = 0; c < cols; c += 1 ) {
      subtotal += row[c];
    }
  }
 public:
  Adder( int row[ ], int cols, int &subtotal ) :
  row( row ), cols( cols ), subtotal( subtotal ) {}
};
int main() {
  const int rows = 10, cols = 10;
  int matrix[rows][cols], subtotals[rows], total = 0, r;
  // read matrix
  Adder * adders[rows];
  for ( r = 0; r < rows; r += 1 ) { // start threads to sum rows
    adders[r] = new Adder( matrix[r], cols, subtotals[r] );
  }
  for ( r = 0; r < rows; r += 1 ) { // wait for threads to finish
    delete adders[r];
    total += subtotals[r]; // total subtotals
  }
  cout << total << endl;
}

5.11 Exceptions

tasks has stack so it can raise exceptions like coroutines.

local exceptions just work as before.
non-local exceptions are possible

whats different with coroutine is that when you throw non-local exception, the routine that is receiving exception has its own thread, so its already running.

profile
3B CS

0개의 댓글