Fill in the blanks by using appropriate OpenACC pragmas
1. MatrixMultiply.c
#include<stdio.h>
#define N 2500
int main()
{
int i;
int j;
int k;
double a[N][N];
double b[N][N];
double c[N][N];
for (i = 0; i <= N-1; i += 1) {
for (j = 0; j <= N-1; j += 1) {
a[i][j] = (i + 1);
}
}
for (i = 0; i <= N-1; i += 1) {
for (j = 0; j <= N-1; j += 1) {
b[i][j] = (j + 1);
}
}
for (i = 0; i <= N-1; i += 1) {
for (j = 0; j <= N-1; j += 1) {
c[i][j] = 0;
}
}
for (i = 0; i <= N-1; i += 1) {
for (j = 0; j <= N-1; j += 1) {
for (k = 0; k <= N-1; k += 1) {
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
}
}
printf("c[0][0]=%lf\n",c[0][0]);
printf("c[%d][%d]=%lf\n",N-1,N-11,c[N-1][N-1]);
return 0;
}
2. 3mm.c
//3 Matrix Multiplications (E=A.B; F=C.D; G=E.F)
#include<stdio.h>
#define N 500
int main()
{
int i;
int j;
int k;
double a[N][N];
double b[N][N];
double c[N][N];
double d[N][N];
double e[N][N];
double f[N][N];
double result[N][N];
//Array Initialization
for (i = 0; i <= N-1; i += 1) {
for (j = 0; j <= N-1; j += 1) {
a[i][j] = ((double )(0.1 * i + j));
b[i][j] = ((double )(0.2 * j + i));
c[i][j] = ((double )(0.3 * i + j));
d[i][j] = ((double )(0.4 * j + i));
e[i][j] = ((double )(0.5 * i + j));
f[i][j] = ((double )(0.6 * j + i));
result[i][j] = 0.0;
printf("");
}
}
//result = a.b
for (i = 0; i <= N-1; i += 1) {
for (j = 0; j <= N-1; j += 1) {
for (k = 0; k <= N-1; k += 1) {
result[i][j] = result[i][j] + a[i][k] * b[k][j];
}
}
}
//print a.b
printf("A[0][0]=%lf\n",result[0][0]);
printf("A[%d][%d]=%lf\n",N-1,N-1,result[N-1][N-1]);
#if 0
#endif
#if 1
//result = c.d
for (i = 0; i <= N-1; i += 1) {
for (j = 0; j <= N-1; j += 1) {
for (k = 0; k <= N-1; k += 1) {
result[i][j] = result[i][j] + c[i][k] * d[k][j];
}
}
}
//print c.d
printf("B[0][0]=%lf\n",result[0][0]);
printf("B[%d][%d]=%lf\n",N-1,N-1,result[N-1][N-1]);
#if 0
#endif
//result = e.f
for (i = 0; i <= N-1; i += 1) {
for (j = 0; j <= N-1; j += 1) {
for (k = 0; k <= N-1; k += 1) {
result[i][j] = result[i][j] + e[i][k] * f[k][j];
}
}
}
//print e.f
printf("C[0][0]=%lf\n",result[0][0]);
printf("C[%d][%d]=%lf\n",N-1,N-1,result[N-1][N-1]);
#endif
#if 0
#endif
return 0;
}
3. MonteCarloPi.c
#include <stdio.h>
#include <time.h>
#define num_steps 1000000
int main()
{
int i;
double step;
double pi;
double x;
double sum = 0.0;
step = 1.0 / ((double )num_steps);
for (i = 0; i <= num_steps; i += 1) {
x = (i + 0.5) * step;
sum = sum + 4.0 / (1.0 + x * x);
}
pi = step * sum;
printf("pi = %f\n",pi);
}
4. VectorArithmetic.c
//C program to implement Vector Arithmetic
#include <stdio.h>
#define N 1300
int main()
{
double A[N];
double B[N];
double C[N];
double D[N];
double E[N];
int i = 0;
//Array initialization
for (i = 0; i <= N-1; i += 1) {
A[i] = ((double )i);
B[i] = ((double )(i + 1));
}
//C=A+B
for (i = 0; i <= N-1; i += 1) {
C[i] = A[i] + B[i];
}
//Verify result
for (i = 0; i <= N-1; i += 1) {
if (C[i] != A[i] + B[i]) {
printf("Add : Something didn't work correctly!\n");
break;
}
}
if (i == N) {
printf("Add : Everything seems to work fine! \n");
}
//D=A-B
for (i = 0; i <= N-1; i += 1) {
D[i] = A[i] - B[i];
}
//Verify result
for (i = 0; i <= N-1; i += 1) {
if (D[i] != A[i] - B[i]) {
printf("Sub : Something didn't work correctly!\n");
break;
}
}
if (i == N) {
printf("Sub : Everything seems to work fine! \n");
}
//E=A*B
for (i = 0; i <= N-1; i += 1) {
E[i] = A[i] * B[i];
}
//Verify result
for (i = 0; i <= N-1; i += 1) {
if (E[i] != A[i] * B[i]) {
printf("Mult : Something didn't work correctly!\n");
break;
}
}
if (i == N) {
printf("Mult : Everything seems to work fine! \n");
}
return 0;
}
5. VectorRev.c
#include<stdio.h>
#define SIZE 550000
int main()
{
int A[SIZE];
int B[SIZE];
int i;
for (i = 0; i <= SIZE-1; i += 1) {
A[i] = 2 * (i + 1);
}
for (i = 0; i <= SIZE-1; i += 1) {
B[SIZE- i - 1] = A[i];
}
/*
printf("\nInput Vector :\n");
for (i = 0; i <SIZE; i++)
{
printf("%d ",A[i]);
}
printf("\n\nReversed vector :\n");
for (i = 0; i <SIZE; i++)
{
printf("%d ",B[i]);
}
*/
printf("B[0]=%d\n",B[0]);
printf("B[%d]=%d\n",SIZE-1,B[SIZE-1]);
printf("\n");
return 0;
}