blob: 81fdedf1b3ca9384d7fabdb19e49f6fbf8f87a0d [file] [edit]
// RUN: %clang -std=c11 -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -std=c11 -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -std=c11 -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -std=c11 -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme -S | %lli -
// RUN: %clang -std=c11 -O0 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme --enzyme-inline=1 -S | %lli -
// RUN: %clang -std=c11 -O1 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme --enzyme-inline=1 -S | %lli -
// RUN: %clang -std=c11 -O2 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme --enzyme-inline=1 -S | %lli -
// RUN: %clang -std=c11 -O3 %s -S -emit-llvm -o - | %opt - %OPloadEnzyme %enzyme --enzyme-inline=1 -S | %lli -
#include <stdio.h>
#include <math.h>
#include <assert.h>
#include "test_utils.h"
#include <mpi.h>
// XFAIL: *
double __enzyme_autodiff(void*, ...);
double mpi_bcast_test(double b, int n, int rank, int numprocs) {
#define n 1
//double a[n];
//for (int i=0; i<n; i++) a[i] = b;
double a = b;
//memcpy(buf, a, sizeof(double)*n);
MPI_Bcast(&a,n,MPI_DOUBLE,0,MPI_COMM_WORLD);
//double sum = 0;
//for(int i=0;i<n;i++)
// sum += pow(a[i], rank+1);
//sum = a[0];
printf("end ran %f %d/%d\n", a, rank, numprocs);
fflush(0);
return a;
}
MPI_Op op = MPI_SUM;
MPI_Op operation;
void my_sum_function(void* inputBuffer, void* outputBuffer, int* len, MPI_Datatype* datatype)
{
int* input = (int*)inputBuffer;
int* output = (int*)outputBuffer;
for(int i = 0; i < *len; i++)
{
output[i] += input[i];
}
}
int main(int argc, char** argv) {
MPI_Init(&argc, &argv);
double h=1e-6;
if(argc<2) {
printf("Not enough arguments. Missing problem size.");
MPI_Finalize();
return 0;
}
int numprocs;
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
int N=10;
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Op_create(&my_sum_function, 1, &operation);
float local_sum = 0;
// Reduce all of the local sums into the global sum
float global_sum;
MPI_Reduce(&local_sum, &global_sum, 1, MPI_FLOAT, operation, 0,
MPI_COMM_WORLD);
double res = __enzyme_autodiff((void*)mpi_bcast_test, 10.0+rank, N, rank, numprocs);
printf("res=%f rank=%d\n", res, rank);
fflush(0);
MPI_Finalize();
}