Translating Mathematica expression to High Performance Fortran
Author
Anton Antonov
Title
Translating Mathematica expression to High Performance Fortran
Description
This paper introduces some ideas for translating the functional language Mathematica to the data-parallel language High Performance Fortran (HPF). It first discusses why we have the ability to do that. Then it gives some interpretations by Category Theory. Third the translating approach is presented for different Mathematica expressions that could be interpreted as specifications for parallel independence, reduction, task parallelism and subprogram's data mapping. Last is shown a simple executable program generated by the translator.
Category
Educational Materials
Keywords
URL
http://www.notebookarchive.org/2018-10-10qgpsl/
DOI
https://notebookarchive.org/2018-10-10qgpsl
Date Added
2018-10-02
Date Last Modified
2018-10-02
File Size
32.52 kilobytes
Supplements
Rights
Redistribution rights reserved
This notebook has not been updated since 2004.
Download
Open in Wolfram Cloud
Translating Mathematica expression to High Performance Fortran
Translating Mathematica expression to High Performance Fortran
Evaluate this
Evaluate this
In[]:=
Out[]=
{}
Out[]=
4
Out[]=
{1,2,3,4,5,6,7,8}
Out[]=
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
3 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
7 | 7 | 7 | 7 | 7 | 7 | 7 | 7 |
8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
Out[]=
|
|
|
| ||||||||||||||||||||||||||||||||
|
|
|
|
Out[]=
|
|
|
|
|
|
|
| ||||||||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
Examples
Examples
In[]:=
HPFSPECIFICATIONS={};
In[]:=
FortranForm[im1=Partition[image,bsize]]FortranForm[im2=Map[Transpose,im1]]FortranForm[im4=#1^2&[im1]]FortranForm[im2=Map[#1^2&,im1]]FortranForm[im2=Map[Sin[#1]&,im1]]FortranForm[im3=Fold[Plus,x0,im1]]
Out[]=
!hpf$ INDEPENDENT, NEW(i)do i=1,size(image,1)/bsizeim1(i,:,:)=image(bsize*(i-1)+1:bsize*i,:)end do
Out[]=
!hpf$ INDEPENDENT, NEW(i)do i=1,size(im1,1)im2(i,:,:)=transpose(im1(i,:,:))end do
Out[]=
forall(i1=1:size(im1,1),i2=1:size(im1,2),i3=1:size(im1,3))im4(i1,i2,i3)=im1(i1,i2,i3)**2end forall
Out[]=
!hpf$ INDEPENDENT, NEW(i,i1,i2)do i=1,size(im1,1)forall(i1=1:size(im1(i,:,:),1),i2=1:size(im1(i,:,:),2))im2(i,i1,i2)=im1(i,i1,i2)**2end forallend do
Out[]=
!hpf$ INDEPENDENT, NEW(i,i1,i2)do i=1,size(im1,1)forall(i1=1:size(im1(i,:,:),1),i2=1:size(im1(i,:,:),2))im2(i,i1,i2)=Sin(im1(i,i1,i2))end forallend do
Out[]=
im3(:,:)=x0!hpf$ INDEPENDENT, NEW(i), REDUCTION(im3)do i=1,size(im1,1)im3(:,:)=im1(i,:,:) + im3(:,:)end do
In[]:=
FortranForm[r1=Composition[Sin[#1]&,Cos[#1]&,#1^2&][im2]]
Out[]=
!hpf$ TASK_REGION !hpf$ ON HOME(v1Func), RESIDENT, BEGIN forall(i1=1:size(im2,1),i2=1:size(im2,2),i3=1:size(im2,3))v1Func(i1,i2,i3)=Sin(im2(i1,i2,i3))end forall!hpf$ END ON v2Func=v1Func!hpf$ ON HOME(v2Func), RESIDENT, BEGIN forall(i1=1:size(v1Func,1),i2=1:size(v1Func,2),i3=1:size(v1Func,3))v2Func(i1,i2,i3)=Cos(v1Func(i1,i2,i3))end forall!hpf$ END ON v3Func=v2Func!hpf$ ON HOME(v3Func), RESIDENT, BEGIN forall(i1=1:size(v2Func,1),i2=1:size(v2Func,2),i3=1:size(v2Func,3))v3Func(i1,i2,i3)=v2Func(i1,i2,i3)**2end forall!hpf$ END ON r1=v3Func!hpf$ END TASK_REGION
Sample Session
Sample Session
In[]:=
bsize=4line=Table[i,{i,1,8}]image=Table[i,{i,1,8},{j,1,8}]im1=Partition[image,bsize]im2=Map[Transpose,im1]im1=Partition[image,bsize]im2=Map[Transpose,im1]im2=Map[#1^2&,im1]im3=Fold[Plus,x0,im1]
Out[]=
4
Out[]=
{1,2,3,4,5,6,7,8}
Out[]=
{{1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4},{5,5,5,5,5,5,5,5},{6,6,6,6,6,6,6,6},{7,7,7,7,7,7,7,7},{8,8,8,8,8,8,8,8}}
Out[]=
{{{1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4}},{{5,5,5,5,5,5,5,5},{6,6,6,6,6,6,6,6},{7,7,7,7,7,7,7,7},{8,8,8,8,8,8,8,8}}}
Out[]=
{{{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}},{{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8}}}
Out[]=
{{{1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2},{3,3,3,3,3,3,3,3},{4,4,4,4,4,4,4,4}},{{5,5,5,5,5,5,5,5},{6,6,6,6,6,6,6,6},{7,7,7,7,7,7,7,7},{8,8,8,8,8,8,8,8}}}
Out[]=
{{{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}},{{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8},{5,6,7,8}}}
Out[]=
{{{1,1,1,1,1,1,1,1},{4,4,4,4,4,4,4,4},{9,9,9,9,9,9,9,9},{16,16,16,16,16,16,16,16}},{{25,25,25,25,25,25,25,25},{36,36,36,36,36,36,36,36},{49,49,49,49,49,49,49,49},{64,64,64,64,64,64,64,64}}}
Out[]=
{{6+x0,6+x0,6+x0,6+x0,6+x0,6+x0,6+x0,6+x0},{8+x0,8+x0,8+x0,8+x0,8+x0,8+x0,8+x0,8+x0},{10+x0,10+x0,10+x0,10+x0,10+x0,10+x0,10+x0,10+x0},{12+x0,12+x0,12+x0,12+x0,12+x0,12+x0,12+x0,12+x0}}
In[]:=
Clear[PreFunction]FORTRANPROGRAM={};HPFSPECIFICATIONS={};PreFunction[u___]:=Module[{},AppendTo[FORTRANPROGRAM,FortranForm[u]];u;]SetAttributes[PreFunction,HoldFirst]
In[]:=
FORTRANPROGRAM={};HPFSPECIFICATIONS={};$Pre=PreFunctionClear[bsize,line,image,im1,im2,im3]bsize=4line=Table[i,{i,1,8}]image=Table[i,{i,1,8},{j,1,8}]im1=Partition[image,bsize]im2=Map[Transpose,im1]im2=Map[#1^2&,im2]im3=Fold[Plus,x0,im1]$Pre=.;FORTRANPROGRAM=Join[HPFSPECIFICATIONS,Drop[FORTRANPROGRAM,-1]];
Out[]=
PreFunction
In[]:=
Map[Print,FORTRANPROGRAM];
!hpf$ PROCESSORS squad(2,1)!hpf$ DISTRIBUTE image(BLOCK(4),BLOCK(8)) ONTO squad!hpf$ ALIGN im1(i,*,:) WITH image((i-1)*4+1,:)
Clear(bsize,line,image,im1,im2,im3)
bsize=4
!hpf$ INDEPENDENTforall(i=1:8) line(i)=i
!hpf$ INDEPENDENTforall(i=1:8,j=1:8) image(i,j)=i
!hpf$ INDEPENDENT, NEW(i)do i=1,size(image,1)/bsizeim1(i,:,:)=image(bsize*(i-1)+1:bsize*i,:)end do
!hpf$ INDEPENDENT, NEW(i)do i=1,size(im1,1)im2(i,:,:)=transpose(im1(i,:,:))end do
!hpf$ INDEPENDENT, NEW(i,i1,i2)do i=1,size(im2,1)forall(i1=1:size(im2(i,:,:),1),i2=1:size(im2(i,:,:),2))im2(i,i1,i2)=im2(i,i1,i2)**2end forallend do
im3(:,:)=x0!hpf$ INDEPENDENT, NEW(i), REDUCTION(im3)do i=1,size(im1,1)im3(:,:)=im1(i,:,:) + im3(:,:)end do
In[]:=
fprog=OpenWrite["fprog.hpf"]Map[(Write[fprog,OutputForm[#1]];Write[fprog,OutputForm[" "]])&,FORTRANPROGRAM];Close[fprog]
Out[]=
OutputStream[fprog.hpf,6]
Out[]=
fprog.hpf
Cite this as: Anton Antonov, "Translating Mathematica expression to High Performance Fortran" from the Notebook Archive (2004), https://notebookarchive.org/2018-10-10qgpsl
Download