Advertisement
Tanishk26

PP

May 4th, 2025
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.63 KB | None | 0 0
  1. // Histogram  //
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <omp.h>
  6.  
  7. #define SIZE 1000
  8. #define MAX_VAL 2000
  9.  
  10. int main() {
  11.     int *data = malloc(SIZE * sizeof(int));
  12.     int histogram_parallel[MAX_VAL] = {0};
  13.  
  14.     // Generate random data
  15.     for (int i = 0; i < SIZE; i++)
  16.         data[i] = rand() % MAX_VAL;
  17.  
  18.     // Compute histogram in parallel
  19.     double start = omp_get_wtime();
  20.     #pragma omp parallel for
  21.     for (int i = 0; i < SIZE; i++) {
  22.         #pragma omp atomic
  23.         histogram_parallel[data[i]]++;
  24.     }
  25.     double end = omp_get_wtime();
  26.     printf("Parallel Execution Time: %f seconds\n", end - start);
  27.  
  28.     // Create the sorted array based on the histogram
  29.     int *sorted_array = malloc(SIZE * sizeof(int));
  30.     int index = 0;
  31.     for (int i = 0; i < MAX_VAL; i++) {
  32.         for (int j = 0; j < histogram_parallel[i]; j++) {
  33.             sorted_array[index++] = i;
  34.         }
  35.     }
  36.  
  37.     // Print the sorted array
  38.     printf("Sorted array:\n");
  39.     for (int i = 0; i < SIZE; i++) {
  40.         printf("%d ", sorted_array[i]);
  41.     }
  42.     printf("\n");
  43.  
  44.     // Free allocated memory
  45.     free(data);
  46.     free(sorted_array);
  47.  
  48.     return 0;
  49. }
  50.  
  51.  
  52. // BFS //
  53.  
  54. #include <stdio.h>
  55. #include <stdbool.h>
  56. #include <omp.h>
  57.  
  58. #define MAX_VERTICES 100
  59. #define MAX_EDGES 200  // Maximum edges per vertex
  60.  
  61. typedef struct {
  62.     int V;                      // Number of vertices
  63.     int adj[MAX_VERTICES][MAX_EDGES];  // Adjacency lists
  64.     int adjSize[MAX_VERTICES];  // Size of each adjacency list
  65. } Graph;
  66.  
  67. void initGraph(Graph* graph, int V) {
  68.     if (V > MAX_VERTICES) {
  69.         printf("Error: Exceeds maximum vertices (%d)\n", MAX_VERTICES);
  70.         return;
  71.     }
  72.     graph->V = V;
  73.     for (int i = 0; i < V; i++) {
  74.         graph->adjSize[i] = 0;
  75.     }
  76. }
  77.  
  78. void addEdge(Graph* graph, int v, int w) {
  79.     if (v >= graph->V || w >= graph->V) {
  80.         printf("Error: Vertex index out of bounds\n");
  81.         return;
  82.     }
  83.     if (graph->adjSize[v] >= MAX_EDGES || graph->adjSize[w] >= MAX_EDGES) {
  84.         printf("Error: Maximum edges per vertex reached (%d)\n", MAX_EDGES);
  85.         return;
  86.     }
  87.     graph->adj[v][graph->adjSize[v]++] = w;
  88.     graph->adj[w][graph->adjSize[w]++] = v;
  89. }
  90.  
  91. void addEdgesFromUser(Graph* graph) {
  92.     int numEdges;
  93.     printf("Enter number of edges: ");
  94.     scanf("%d", &numEdges);
  95.  
  96.     printf("Enter edges as pairs of vertices (0-based indexing):\n");
  97.     for (int i = 0; i < numEdges; i++) {
  98.         int v, w;
  99.         scanf("%d %d", &v, &w);
  100.         addEdge(graph, v, w);
  101.     }
  102. }
  103.  
  104. void parallelBFS(Graph* graph, int start) {
  105.     if (start >= graph->V) {
  106.         printf("Error: Start vertex out of bounds\n");
  107.         return;
  108.     }
  109.  
  110.     bool visited[MAX_VERTICES] = {false};
  111.     int queue[MAX_VERTICES];
  112.     int front = 0, rear = 0;
  113.  
  114.     visited[start] = true;
  115.     queue[rear++] = start;
  116.  
  117.     printf("BFS Traversal starting from vertex %d:\n", start);
  118.     while (front < rear) {
  119.         int current = queue[front++];
  120.         printf("%d ", current);
  121.  
  122.         #pragma omp parallel for
  123.         for (int i = 0; i < graph->adjSize[current]; i++) {
  124.             int neighbor = graph->adj[current][i];
  125.            
  126.             // Atomic check if not visited
  127.             bool expected = false;
  128.             #pragma omp atomic capture
  129.             { expected = visited[neighbor]; visited[neighbor] = true; }
  130.            
  131.             if (!expected) {
  132.                 #pragma omp critical
  133.                 {
  134.                     queue[rear++] = neighbor;
  135.                 }
  136.             }
  137.         }
  138.     }
  139.     printf("\n");
  140. }
  141.  
  142. int main() {
  143.     Graph g;
  144.     int vertexCount, startVertex;
  145.  
  146.     printf("Enter number of vertices: ");
  147.     scanf("%d", &vertexCount);
  148.     initGraph(&g, vertexCount);
  149.  
  150.     addEdgesFromUser(&g);
  151.  
  152.     printf("Enter starting vertex for BFS: ");
  153.     scanf("%d", &startVertex);
  154.  
  155.     parallelBFS(&g, startVertex);
  156.  
  157.     return 0;
  158. }
  159.  
  160. // Dijakstra //
  161.  
  162. #include <stdio.h>
  163. #include <stdlib.h>
  164. #include <limits.h>
  165. #include <omp.h>
  166.  
  167. #define V 10
  168.  
  169. int minDistance(int dist[], int sptSet[]) {
  170.     int min = INT_MAX, min_index = -1;
  171.  
  172.     #pragma omp atomic
  173.     for (int v = 0; v < V; v++) {
  174.         if (!sptSet[v] && dist[v] <= min) {
  175.             min = dist[v];
  176.             min_index = v;
  177.         }
  178.     }
  179.  
  180.     return min_index;
  181. }
  182.  
  183. void dijkstra(int graph[V][V], int src) {
  184.     int dist[V], sptSet[V];
  185.  
  186.     #pragma omp parallel for
  187.     for (int i = 0; i < V; i++) {
  188.         dist[i] = INT_MAX;
  189.         sptSet[i] = 0;
  190.     }
  191.  
  192.     dist[src] = 0;
  193.  
  194.     #pragma omp parallel for
  195.     for (int count = 0; count < V - 1; count++) {
  196.         int u = minDistance(dist, sptSet);
  197.         if (u == -1) break;
  198.  
  199.         sptSet[u] = 1;
  200.  
  201.         for (int v = 0; v < V; v++) {
  202.             if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) {
  203.                 dist[v] = dist[u] + graph[u][v];
  204.             }
  205.         }
  206.     }
  207.  
  208.     // Uncomment to print the constructed distance array
  209.     printf("Vertex \t Distance from Source\n");
  210.     for (int i = 0; i < V; i++)
  211.         printf("%d \t\t %d\n", i, dist[i]);
  212.     printf("\n");
  213. }
  214.  
  215. int main() {
  216.     int graph[V][V];
  217.     srand(0);
  218.  
  219.     #pragma omp parallel for collapse(2)
  220.     for (int i = 0; i < V; i++) {
  221.         for (int j = 0; j < V; j++) {
  222.             graph[i][j] = (i == j) ? 0 : rand() % 11;
  223.         }
  224.     }
  225.  
  226.     // double start_time = omp_get_wtime();
  227.     dijkstra(graph, 0);
  228.     // double end_time = omp_get_wtime();
  229.  
  230.     // printf("Execution time: %f seconds\n", end_time - start_time);
  231.  
  232.     return 0;
  233. }
  234.  
  235. // Matrix Multiplication
  236.  
  237. #include <stdio.h>
  238. #include <stdlib.h>
  239. #include <omp.h> // Include OpenMP header
  240.  
  241. #define MAX 500
  242.  
  243. int A[MAX][MAX], B[MAX][MAX], C[MAX][MAX];
  244. int r1, c1, r2, c2;
  245.  
  246. // Function to generate random elements for matrices using OpenMP
  247. void generate_random_elements(int matrix[MAX][MAX], int rows, int cols) {
  248.     #pragma omp parallel for
  249.     for (int i = 0; i < rows; i++) {
  250.         for (int j = 0; j < cols; j++) {
  251.             matrix[i][j] = rand() % 100; // Random numbers between 0 and 99
  252.         }
  253.     }
  254. }
  255.  
  256. int main() {
  257.     srand(42); // Seed for random number generation
  258.  
  259.     printf("Enter rows and columns for matrix A: ");
  260.     scanf("%d%d", &r1, &c1);
  261.     printf("Enter rows and columns for matrix B: ");
  262.     scanf("%d%d", &r2, &c2);
  263.  
  264.     if (c1 != r2) {
  265.         printf("Matrix multiplication not possible.\n");
  266.         return -1;
  267.     }
  268.  
  269.     // Generate random elements for matrices A and B
  270.     printf("Generating random elements for matrix A...\n");
  271.     generate_random_elements(A, r1, c1);
  272.     printf("Generating random elements for matrix B...\n");
  273.     generate_random_elements(B, r2, c2);
  274.  
  275.     // Measure the time taken for matrix multiplication
  276.     double start_time = omp_get_wtime();
  277.  
  278.     // Parallelize the matrix multiplication using OpenMP
  279.     #pragma omp parallel for
  280.     for (int i = 0; i < r1; i++) {
  281.         for (int j = 0; j < c2; j++) {
  282.             C[i][j] = 0;
  283.             for (int k = 0; k < c1; k++) {
  284.                 C[i][j] += A[i][k] * B[k][j];
  285.             }
  286.         }
  287.     }
  288.  
  289.     double end_time = omp_get_wtime();
  290.  
  291.     // Display the resultant matrix
  292.     printf("Resultant matrix C:\n");
  293.     for (int i = 0; i < r1; i++) {
  294.         for (int j = 0; j < c2; j++) {
  295.             printf("%d ", C[i][j]);
  296.         }
  297.         printf("\n");
  298.     }
  299.  
  300.     // Display the time taken and the number of threads used
  301.     printf("Time taken for matrix multiplication: %f seconds\n", end_time - start_time);
  302.     printf("Number of threads used: %d\n", omp_get_max_threads());
  303.  
  304.  
  305.     return 0;
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement