C言語で並列計算を行う方法は?
C言語には、並列計算を実現するためにマルチスレッドを使用することができます。以下は、マルチスレッドを使用して並列計算を行う方法を示す単純なサンプルコードです。
#include <stdio.h>
#include <pthread.h>
#define THREADS_COUNT 4
#define ARRAY_SIZE 1000000
int array[ARRAY_SIZE];
int sum = 0;
// 线程函数,用于计算数组的部分和
void* calculateSum(void* arg) {
int thread_id = *(int*)arg;
int start = thread_id * (ARRAY_SIZE / THREADS_COUNT);
int end = start + (ARRAY_SIZE / THREADS_COUNT);
for (int i = start; i < end; i++) {
sum += array[i];
}
return NULL;
}
int main() {
// 初始化数组
for (int i = 0; i < ARRAY_SIZE; i++) {
array[i] = i;
}
pthread_t threads[THREADS_COUNT];
int thread_ids[THREADS_COUNT];
// 创建多个线程,每个线程负责计算数组的一部分
for (int i = 0; i < THREADS_COUNT; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, calculateSum, &thread_ids[i]);
}
// 等待所有线程执行完毕
for (int i = 0; i < THREADS_COUNT; i++) {
pthread_join(threads[i], NULL);
}
printf("Sum: %d\n", sum);
return 0;
}
上記のコードでは、整数配列arrayに100万の要素を定義し、その後4つのスレッドを作成し、各スレッドが配列の一部の合計を算出します。最後に、部分合計を合算して最終結果を出力します。
並列計算においては、スレッドセーフを確保するために、競合条件を避けるために複数のスレッドが同時にsum変数を変更するのを防ぐために、ミューテックス(mutex)を使用しています。この単純な例では、ミューテックスを使用する必要はありませんが、各スレッドが計算する部分が重複しないため、同じメモリ位置に同時にアクセスすることはありません。しかし、より複雑な並列計算では、データの整合性を確保するためにミューテックスを使用する必要がある場合があります。
また注意すべき点は、マルチスレッドがプログラムのパフォーマンスを必ずしも向上させるわけではないということです。複数のスレッド間の切り替えや同期のコストは、並列計算によるパフォーマンス向上を上回る可能性があります。そのため、マルチスレッドを使用して並列計算を行う際は、具体的なアプリケーションシナリオに基づいて評価と最適化を行う必要があります。