Computer Science 335
Parallel Processing and High Performance Computing

Fall 2024, Siena College

Lab 9: Introduction to pthreads
Due: 9:00 AM, Friday, November 1, 2024

In this lab, we will return to the paradigm for parallelism you have all used with Java: multithreading. So far with our work in C, we have been working with message passing. In that case, each process has its own private address space. That is, each process has its own variables and any information to be exchanged among processes needs to be done with explicit message passing. Multithreading usually allows for the use of shared memory. Many operating systems provide support for threads, and a standard interface has been developed: POSIX Threads or pthreads.

You may work alone or with a partner on this lab.

Learning goals:

  1. To learn the basics of POSIX thread creation and destruction in C

Getting Set Up

In Canvas, you will find a link to follow to set up your GitHub repository, which will be named pthreads-lab-yourgitname, for this lab. Only one member of the group should follow the link to set up the repository on GitHub, then others should request a link to be granted write access.

You may answer the lab questions right in the README.md file of your repository, or use the README.md to provide a link to a Google document that has been shared with your instructor or the name of a PDF of your responses that you would upload to your repository.

Readings

Before starting, read through Pacheco Sections 4.1 and 4.2.

pthreads Basics

The basic idea is that we can create and destroy threads of execution in a program, on the fly, during its execution. These threads can then be executed in parallel by the operating system scheduler. If we have multiple processors, we should be able to achieve a speedup over the single-threaded equivalent.

We start with a look at a pthreads "Hello, world" program, which is in the pthreadhello directory of your repository for this lab.

The most basic functionality involves the creation and destruction of threads:

Prototypes for pthread functions are in pthread.h and programs need to link with libpthread.a (use -lpthread at link time).

Any global variables in your program are accessible to all threads. Local variables are directly accessible only to the thread in which they were created, though the memory can be shared by passing a pointer as part of the last argument to pthread_create().

Practice Program: Create a new version of the pthreadhello.c program in a file pthreadhello-more.c in the pthreadmore directory of your repository that takes a command-line parameter that specifies the number of threads to create. This is very similar to what you see in Pacheco Program 4.1, except we will pass pointers to entries of an array of numbers 1 through n as the thread parameter as is done in the 2-thread version. (10 points)

A more interesting example is in proctree_threads.

This example builds a "tree" of threads to a depth given on the command line. It includes calls to pthread_self(), which returns the thread identifier of the calling thread.

Try it out and study the code to make sure you understand how it works.

Question 1: What is the output when you run the program for a tree of depth 3 on noreaster? (1 points)

Question 2: How many calls are made to the split_proc function for a tree of depth n? (3 points)

Question 3: What is the largest tree you can create on noreaster before you start to get thread creation errors? (1 point)

Multithreaded Pi

Practice Program: Write a pthread version of the Monte Carlo approximation of pi. Call your program pthread_pi.c in the pi directory of your repository. See below for some tips. (20 points)

Submission

Commit and push!

Grading

This assignment will be graded out of 35 points.

Feature

Value Score
pthreadhello-more.c 10
Lab Question 1 1
Lab Question 2 3
Lab Question 3 1
pthread-pi.c 20
Total 35