annotate src/fftw-3.3.5/doc/html/Allocating-aligned-memory-in-Fortran.html @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 2cd0e3b3e1fd
children
rev   line source
Chris@42 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
Chris@42 2 <html>
Chris@42 3 <!-- This manual is for FFTW
Chris@42 4 (version 3.3.5, 30 July 2016).
Chris@42 5
Chris@42 6 Copyright (C) 2003 Matteo Frigo.
Chris@42 7
Chris@42 8 Copyright (C) 2003 Massachusetts Institute of Technology.
Chris@42 9
Chris@42 10 Permission is granted to make and distribute verbatim copies of this
Chris@42 11 manual provided the copyright notice and this permission notice are
Chris@42 12 preserved on all copies.
Chris@42 13
Chris@42 14 Permission is granted to copy and distribute modified versions of this
Chris@42 15 manual under the conditions for verbatim copying, provided that the
Chris@42 16 entire resulting derived work is distributed under the terms of a
Chris@42 17 permission notice identical to this one.
Chris@42 18
Chris@42 19 Permission is granted to copy and distribute translations of this manual
Chris@42 20 into another language, under the above conditions for modified versions,
Chris@42 21 except that this permission notice may be stated in a translation
Chris@42 22 approved by the Free Software Foundation. -->
Chris@42 23 <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
Chris@42 24 <head>
Chris@42 25 <title>FFTW 3.3.5: Allocating aligned memory in Fortran</title>
Chris@42 26
Chris@42 27 <meta name="description" content="FFTW 3.3.5: Allocating aligned memory in Fortran">
Chris@42 28 <meta name="keywords" content="FFTW 3.3.5: Allocating aligned memory in Fortran">
Chris@42 29 <meta name="resource-type" content="document">
Chris@42 30 <meta name="distribution" content="global">
Chris@42 31 <meta name="Generator" content="makeinfo">
Chris@42 32 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Chris@42 33 <link href="index.html#Top" rel="start" title="Top">
Chris@42 34 <link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
Chris@42 35 <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
Chris@42 36 <link href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" rel="up" title="Calling FFTW from Modern Fortran">
Chris@42 37 <link href="Accessing-the-wisdom-API-from-Fortran.html#Accessing-the-wisdom-API-from-Fortran" rel="next" title="Accessing the wisdom API from Fortran">
Chris@42 38 <link href="Plan-execution-in-Fortran.html#Plan-execution-in-Fortran" rel="prev" title="Plan execution in Fortran">
Chris@42 39 <style type="text/css">
Chris@42 40 <!--
Chris@42 41 a.summary-letter {text-decoration: none}
Chris@42 42 blockquote.smallquotation {font-size: smaller}
Chris@42 43 div.display {margin-left: 3.2em}
Chris@42 44 div.example {margin-left: 3.2em}
Chris@42 45 div.indentedblock {margin-left: 3.2em}
Chris@42 46 div.lisp {margin-left: 3.2em}
Chris@42 47 div.smalldisplay {margin-left: 3.2em}
Chris@42 48 div.smallexample {margin-left: 3.2em}
Chris@42 49 div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
Chris@42 50 div.smalllisp {margin-left: 3.2em}
Chris@42 51 kbd {font-style:oblique}
Chris@42 52 pre.display {font-family: inherit}
Chris@42 53 pre.format {font-family: inherit}
Chris@42 54 pre.menu-comment {font-family: serif}
Chris@42 55 pre.menu-preformatted {font-family: serif}
Chris@42 56 pre.smalldisplay {font-family: inherit; font-size: smaller}
Chris@42 57 pre.smallexample {font-size: smaller}
Chris@42 58 pre.smallformat {font-family: inherit; font-size: smaller}
Chris@42 59 pre.smalllisp {font-size: smaller}
Chris@42 60 span.nocodebreak {white-space:nowrap}
Chris@42 61 span.nolinebreak {white-space:nowrap}
Chris@42 62 span.roman {font-family:serif; font-weight:normal}
Chris@42 63 span.sansserif {font-family:sans-serif; font-weight:normal}
Chris@42 64 ul.no-bullet {list-style: none}
Chris@42 65 -->
Chris@42 66 </style>
Chris@42 67
Chris@42 68
Chris@42 69 </head>
Chris@42 70
Chris@42 71 <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
Chris@42 72 <a name="Allocating-aligned-memory-in-Fortran"></a>
Chris@42 73 <div class="header">
Chris@42 74 <p>
Chris@42 75 Next: <a href="Accessing-the-wisdom-API-from-Fortran.html#Accessing-the-wisdom-API-from-Fortran" accesskey="n" rel="next">Accessing the wisdom API from Fortran</a>, Previous: <a href="Plan-execution-in-Fortran.html#Plan-execution-in-Fortran" accesskey="p" rel="prev">Plan execution in Fortran</a>, Up: <a href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" accesskey="u" rel="up">Calling FFTW from Modern Fortran</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
Chris@42 76 </div>
Chris@42 77 <hr>
Chris@42 78 <a name="Allocating-aligned-memory-in-Fortran-1"></a>
Chris@42 79 <h3 class="section">7.5 Allocating aligned memory in Fortran</h3>
Chris@42 80
Chris@42 81 <a name="index-alignment-5"></a>
Chris@42 82 <a name="index-fftw_005falloc_005freal-5"></a>
Chris@42 83 <a name="index-fftw_005falloc_005fcomplex-5"></a>
Chris@42 84 <p>In order to obtain maximum performance in FFTW, you should store your
Chris@42 85 data in arrays that have been specially aligned in memory (see <a href="SIMD-alignment-and-fftw_005fmalloc.html#SIMD-alignment-and-fftw_005fmalloc">SIMD alignment and fftw_malloc</a>). Enforcing alignment also permits you to
Chris@42 86 safely use the new-array execute functions (see <a href="New_002darray-Execute-Functions.html#New_002darray-Execute-Functions">New-array Execute Functions</a>) to apply a given plan to more than one pair of in/out
Chris@42 87 arrays. Unfortunately, standard Fortran arrays do <em>not</em> provide
Chris@42 88 any alignment guarantees. The <em>only</em> way to allocate aligned
Chris@42 89 memory in standard Fortran is to allocate it with an external C
Chris@42 90 function, like the <code>fftw_alloc_real</code> and
Chris@42 91 <code>fftw_alloc_complex</code> functions. Fortunately, Fortran 2003 provides
Chris@42 92 a simple way to associate such allocated memory with a standard Fortran
Chris@42 93 array pointer that you can then use normally.
Chris@42 94 </p>
Chris@42 95 <p>We therefore recommend allocating all your input/output arrays using
Chris@42 96 the following technique:
Chris@42 97 </p>
Chris@42 98 <ol>
Chris@42 99 <li> Declare a <code>pointer</code>, <code>arr</code>, to your array of the desired type
Chris@42 100 and dimensions. For example, <code>real(C_DOUBLE), pointer :: a(:,:)</code>
Chris@42 101 for a 2d real array, or <code>complex(C_DOUBLE_COMPLEX), pointer ::
Chris@42 102 a(:,:,:)</code> for a 3d complex array.
Chris@42 103
Chris@42 104 </li><li> The number of elements to allocate must be an
Chris@42 105 <code>integer(C_SIZE_T)</code>. You can either declare a variable of this
Chris@42 106 type, e.g. <code>integer(C_SIZE_T) :: sz</code>, to store the number of
Chris@42 107 elements to allocate, or you can use the <code>int(..., C_SIZE_T)</code>
Chris@42 108 intrinsic function. e.g. set <code>sz = L * M * N</code> or use
Chris@42 109 <code>int(L * M * N, C_SIZE_T)</code> for an L&nbsp;&times;&nbsp;M&nbsp;&times;&nbsp;N array.
Chris@42 110
Chris@42 111 </li><li> Declare a <code>type(C_PTR) :: p</code> to hold the return value from
Chris@42 112 FFTW&rsquo;s allocation routine. Set <code>p = fftw_alloc_real(sz)</code> for a real array, or <code>p = fftw_alloc_complex(sz)</code> for a complex array.
Chris@42 113
Chris@42 114 </li><li> <a name="index-c_005ff_005fpointer-2"></a>
Chris@42 115 Associate your pointer <code>arr</code> with the allocated memory <code>p</code>
Chris@42 116 using the standard <code>c_f_pointer</code> subroutine: <code>call
Chris@42 117 c_f_pointer(p, arr, [...dimensions...])</code>, where
Chris@42 118 <code>[...dimensions...])</code> are an array of the dimensions of the array
Chris@42 119 (in the usual Fortran order). e.g. <code>call c_f_pointer(p, arr,
Chris@42 120 [L,M,N])</code> for an L&nbsp;&times;&nbsp;M&nbsp;&times;&nbsp;N array. (Alternatively, you can
Chris@42 121 omit the dimensions argument if you specified the shape explicitly
Chris@42 122 when declaring <code>arr</code>.) You can now use <code>arr</code> as a usual
Chris@42 123 multidimensional array.
Chris@42 124
Chris@42 125 </li><li> When you are done using the array, deallocate the memory by <code>call
Chris@42 126 fftw_free(p)</code> on <code>p</code>.
Chris@42 127
Chris@42 128 </li></ol>
Chris@42 129
Chris@42 130 <p>For example, here is how we would allocate an L&nbsp;&times;&nbsp;M 2d real array:
Chris@42 131 </p>
Chris@42 132 <div class="example">
Chris@42 133 <pre class="example"> real(C_DOUBLE), pointer :: arr(:,:)
Chris@42 134 type(C_PTR) :: p
Chris@42 135 p = fftw_alloc_real(int(L * M, C_SIZE_T))
Chris@42 136 call c_f_pointer(p, arr, [L,M])
Chris@42 137 <em>...use arr and arr(i,j) as usual...</em>
Chris@42 138 call fftw_free(p)
Chris@42 139 </pre></div>
Chris@42 140
Chris@42 141 <p>and here is an L&nbsp;&times;&nbsp;M&nbsp;&times;&nbsp;N 3d complex array:
Chris@42 142 </p>
Chris@42 143 <div class="example">
Chris@42 144 <pre class="example"> complex(C_DOUBLE_COMPLEX), pointer :: arr(:,:,:)
Chris@42 145 type(C_PTR) :: p
Chris@42 146 p = fftw_alloc_complex(int(L * M * N, C_SIZE_T))
Chris@42 147 call c_f_pointer(p, arr, [L,M,N])
Chris@42 148 <em>...use arr and arr(i,j,k) as usual...</em>
Chris@42 149 call fftw_free(p)
Chris@42 150 </pre></div>
Chris@42 151
Chris@42 152 <p>See <a href="Reversing-array-dimensions.html#Reversing-array-dimensions">Reversing array dimensions</a> for an example allocating a
Chris@42 153 single array and associating both real and complex array pointers with
Chris@42 154 it, for in-place real-to-complex transforms.
Chris@42 155 </p>
Chris@42 156 <hr>
Chris@42 157 <div class="header">
Chris@42 158 <p>
Chris@42 159 Next: <a href="Accessing-the-wisdom-API-from-Fortran.html#Accessing-the-wisdom-API-from-Fortran" accesskey="n" rel="next">Accessing the wisdom API from Fortran</a>, Previous: <a href="Plan-execution-in-Fortran.html#Plan-execution-in-Fortran" accesskey="p" rel="prev">Plan execution in Fortran</a>, Up: <a href="Calling-FFTW-from-Modern-Fortran.html#Calling-FFTW-from-Modern-Fortran" accesskey="u" rel="up">Calling FFTW from Modern Fortran</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
Chris@42 160 </div>
Chris@42 161
Chris@42 162
Chris@42 163
Chris@42 164 </body>
Chris@42 165 </html>