Skip to content
Snippets Groups Projects
Commit c7648627 authored by Chichi Lalescu's avatar Chichi Lalescu
Browse files

move transpose to field_descriptor

parent db0c490a
No related branches found
No related tags found
No related merge requests found
......@@ -109,3 +109,50 @@ int field_descriptor::write(
return EXIT_SUCCESS;
}
int field_descriptor::transpose(
float *input,
float *output)
{
// IMPORTANT NOTE:
// for 3D transposition, the input data is messed up
fftwf_plan tplan;
ptrdiff_t dim1;
switch (this->ndims)
{
case 2:
dim1 = this->sizes[1];
break;
case 3:
// transpose the two local dimensions 1 and 2
dim1 = this->sizes[1]*this->sizes[2];
float *atmp;
atmp = (float*)malloc(dim1*sizeof(float));
for (int k = 0; k < this->subsizes[0]; k++)
{
// put transposed slice in atmp
for (int j = 0; j < this->sizes[1]; j++)
for (int i = 0; i < this->sizes[2]; i++)
atmp[i*this->sizes[1] + j] =
input[(k*this->sizes[1] + j)*this->sizes[2] + i];
// copy back transposed slice
for (int j = 0; j < this->sizes[2]; j++)
for (int i = 0; i < this->sizes[1]; i++)
input[(k*this->sizes[2] + j)*this->sizes[1] + i] =
atmp[j*this->sizes[1] + i];
}
free(atmp);
break;
default:
return -1;
break;
}
tplan = fftwf_mpi_plan_transpose(
this->sizes[0], dim1,
input, output,
MPI_COMM_WORLD,
FFTW_ESTIMATE);
fftwf_execute(tplan);
fftwf_destroy_plan(tplan);
return EXIT_SUCCESS;
}
......@@ -33,6 +33,9 @@ class field_descriptor
int write(
const char *fname,
void *buffer);
int transpose(
float *input,
float *output);
};
#endif//__FIELD_DESCRIPTOR__
......
......@@ -2,58 +2,6 @@
int myrank, nprocs;
int transpose(
field_descriptor *f,
float *input,
float *output)
{
// IMPORTANT NOTE:
// for 3D transposition, the input data is messed up
fftwf_plan tplan;
ptrdiff_t dim1;
switch (f->ndims)
{
case 2:
dim1 = f->sizes[1];
break;
case 3:
// transpose the two local dimensions 1 and 2
float *atmp;
atmp = (float*)malloc(f->sizes[1]*f->sizes[2]*sizeof(float));
for (int k = 0; k < f->subsizes[0]; k++)
{
// put transposed slice in atmp
for (int j = 0; j < f->sizes[1]; j++)
for (int i = 0; i < f->sizes[2]; i++)
{
atmp[i*f->sizes[1] + j] =
input[(k*f->sizes[1] + j)*f->sizes[2] + i];
}
// copy back transposed slice
for (int j = 0; j < f->sizes[2]; j++)
for (int i = 0; i < f->sizes[1]; i++)
{
input[(k*f->sizes[2] + j)*f->sizes[1] + i] =
atmp[j*f->sizes[1] + i];
}
}
free(atmp);
dim1 = f->sizes[1]*f->sizes[2];
break;
default:
return -1;
break;
}
tplan = fftwf_mpi_plan_transpose(
f->sizes[0], dim1,
input, output,
MPI_COMM_WORLD,
FFTW_ESTIMATE);
fftwf_execute(tplan);
fftwf_destroy_plan(tplan);
return EXIT_SUCCESS;
}
int main(int argc, char *argv[])
{
MPI_Init(&argc, &argv);
......@@ -101,7 +49,7 @@ int main(int argc, char *argv[])
a0 = (float*)malloc(f0.local_size*sizeof(float));
a1 = (float*)malloc(f1.local_size*sizeof(float));
f0.read("data0", (void*)a0);
transpose(&f0, a0, a1);
f0.transpose(a0, a1);
f1.write("data1", (void*)a1);
free(a0);
free(a1);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment