基于 OpenMP 的快速排序算法代码1调用 omp_set_num_threads 函数设置线程数numThreads利用 parallel 指令将代码复制到 no 个线程上执行。2将排序任务划分到不同的线程中去每个子线程调用 omp_get_num_threads 函数获取当前线程号。主线程调用 omp_get_num_threads 函数获取当前并行的线程个数各线程计算对应序列的起始结束下标
下面是基于 OpenMP 的快速排序算法代码:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
// 串行快速排序函数
void quickSort(int arr[], int left, int right) {
int i = left, j = right;
int pivot = arr[(left + right) / 2];
// 分割
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
// 递归排序左半部分和右半部分
if (left < j)
quickSort(arr, left, j);
if (i < right)
quickSort(arr, i, right);
}
// 并行快速排序函数
void parallelQuickSort(int arr[], int left, int right) {
if (left < right) {
int i = left, j = right;
int pivot = arr[(left + right) / 2];
// 分割
while (i <= j) {
while (arr[i] < pivot)
i++;
while (arr[j] > pivot)
j--;
if (i <= j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
}
// 递归排序左半部分和右半部分
#pragma omp parallel sections
{
#pragma omp section
{
parallelQuickSort(arr, left, j);
}
#pragma omp section
{
parallelQuickSort(arr, i, right);
}
}
}
}
int main() {
int arr[] = {5, 2, 8, 9, 1, 3, 7, 4, 6};
int n = sizeof(arr) / sizeof(arr[0]);
// 设置线程数
int numThreads = 4;
omp_set_num_threads(numThreads);
// 并行快速排序
parallelQuickSort(arr, 0, n - 1);
// 输出排序结果
printf("Sorted array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
在上述代码中,我们使用了 #pragma omp parallel sections 来并行执行两个递归排序任务,每个任务在一个不同的线程中执行。同时,我们使用 omp_set_num_threads 函数设置线程数为 numThreads。最后,我们使用 #pragma omp parallel for 来并行执行循环中的工作量,实现两两合并
原文地址: http://www.cveoy.top/t/topic/ib3V 著作权归作者所有。请勿转载和采集!