#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
void parallel_prefix_sum(int *arr, int n) {
int *temp = (int *)malloc(n * sizeof(int));
if (!temp) {
printf("Memory allocation failed.\n");
return;
}
// First phase: Perform a sequential scan in parallel
#pragma omp parallel for
for (int i = 0; i < n; i++) {
if (i == 0) {
temp[i] = arr[i];
} else {
temp[i] = arr[i] + temp[i - 1];
}
}
// Copy the results back into arr
#pragma omp parallel for
for (int i = 0; i < n; i++) {
arr[i] = temp[i];
}
free(temp);
}
int main() {
int n = 10;
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
printf("Original Array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
parallel_prefix_sum(arr, n);
printf("Prefix Sum Array: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
I2luY2x1ZGUgPG9tcC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKdm9pZCBwYXJhbGxlbF9wcmVmaXhfc3VtKGludCAqYXJyLCBpbnQgbikgewogICAgaW50ICp0ZW1wID0gKGludCAqKW1hbGxvYyhuICogc2l6ZW9mKGludCkpOwogICAgaWYgKCF0ZW1wKSB7CiAgICAgICAgcHJpbnRmKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuXG4iKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLy8gRmlyc3QgcGhhc2U6IFBlcmZvcm0gYSBzZXF1ZW50aWFsIHNjYW4gaW4gcGFyYWxsZWwKICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvcgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICAgICAgIHRlbXBbaV0gPSBhcnJbaV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGVtcFtpXSA9IGFycltpXSArIHRlbXBbaSAtIDFdOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBDb3B5IHRoZSByZXN1bHRzIGJhY2sgaW50byBhcnIKICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvcgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBhcnJbaV0gPSB0ZW1wW2ldOwogICAgfQoKICAgIGZyZWUodGVtcCk7Cn0KCmludCBtYWluKCkgewogICAgaW50IG4gPSAxMDsKICAgIGludCBhcnJbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CgogICAgcHJpbnRmKCJPcmlnaW5hbCBBcnJheTogIik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHByaW50ZigiJWQgIiwgYXJyW2ldKTsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKCiAgICBwYXJhbGxlbF9wcmVmaXhfc3VtKGFyciwgbik7CgogICAgcHJpbnRmKCJQcmVmaXggU3VtIEFycmF5OiAiKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCIlZCAiLCBhcnJbaV0pOwogICAgfQogICAgcHJpbnRmKCJcbiIpOwoKICAgIHJldHVybiAwOwp9Cg==