<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Storage in memory of CCE format for 3d fft in C in Intel® oneAPI Math Kernel Library</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Storage-in-memory-of-CCE-format-for-3d-fft-in-C/m-p/896130#M10880</link>
    <description>&lt;DIV style="margin:0px;"&gt;
&lt;DIV id="quote_reply" style="width: 100%; margin-top: 5px;"&gt;
&lt;DIV style="margin-left:2px;margin-right:2px;"&gt;Quoting - &lt;A href="https://community.intel.com/en-us/profile/93647"&gt;Dmitry Baksheev (Intel)&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV style="background-color:#E5E5E5; padding:5px;border: 1px; border-style: inset;margin-left:2px;margin-right:2px;"&gt;&lt;EM&gt; &lt;BR /&gt;Hi J.,&lt;BR /&gt;&lt;BR /&gt;Suppose we have NX*NY*NZ block of real numbers that we want to apply real-to-CCE to. Let's assume that on input, real element X(nx,ny,nz) is located somewhere in array 'double *ds1'. This 'somewhere' can be expressed precisely as&lt;BR /&gt;#define X(nx,ny,nz) ds1[strides_in[0] + nx*strides_in[1] + ny*strides_in[2] + nz*strides_in[3]]&lt;BR /&gt;&lt;BR /&gt;After we apply the transform, we'll get the result which is NX*NY*(NZ/2+1) complex numbers. Assume we have them, denoted as Y,stored in another array 'complex *ds2', then we can describe this as:&lt;BR /&gt;#define Y(nx,ny,nz) ds2[stride_out[0] + nx*strides_out[1] + ny*strides_out[2] + nz*strides_out[3]].&lt;BR /&gt;Please noticedifferent pointer type for the frequency domain: it is complex, not real. Also, nz in the backward domain runs from 0 to NZ/2-1, because CCE only keeps ~half of the frequency domain data (you can restore the remaining data using CCE symmetry).&lt;BR /&gt;&lt;BR /&gt;For out-of-place transform (defined by DFTI_PLACEMENT configuration value) the values of strides_in andstrides_outcan be defined independently. For in-place transform, they should be correlated, to ensure in-placeness. Typically this is attained bymaking surethat &amp;amp;X(i,j,0) == &amp;amp;Y(i,j,0), for all i,j (the rows numbered by the last index are transformed real-to-CCE, that is NZ real numbers to NZ/2+1 complex numbers).&lt;BR /&gt;&lt;BR /&gt;I hope this will help.&lt;BR /&gt;Dima&lt;/EM&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;BR /&gt;Thank you very much, that is what I needed to know.&lt;BR /&gt;With regards,&lt;BR /&gt;Jan&lt;BR /&gt;</description>
    <pubDate>Tue, 24 Feb 2009 11:30:39 GMT</pubDate>
    <dc:creator>saleslim_cz</dc:creator>
    <dc:date>2009-02-24T11:30:39Z</dc:date>
    <item>
      <title>Storage in memory of CCE format for 3d fft in C</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Storage-in-memory-of-CCE-format-for-3d-fft-in-C/m-p/896128#M10878</link>
      <description>Hi,&lt;BR /&gt;can you please explain me how is the data stored in fourier domain for inplace 3D FFT in C? I understand that the only available format is CCE, which is not completely clearly explained in the reference manual (for 10.1 it is page 2821). I would like to know where should I find the real and complex part of coefficients and how is the data stored in memory. &lt;BR /&gt;&lt;BR /&gt;My code for FFT: &lt;BR /&gt; MKL_LONG retval = DFTI_NO_ERROR;&lt;BR /&gt; MKL_LONG sizes[3] = {data-&amp;gt;NZ, data-&amp;gt;NY, data-&amp;gt;NX - 2};&lt;BR /&gt; MKL_LONG strides_in[4] = {0, data-&amp;gt;NXY, data-&amp;gt;NX, 1};&lt;BR /&gt; MKL_LONG strides_out[4] = {0, data-&amp;gt;NXY / 2, data-&amp;gt;NX / 2,1};&lt;BR /&gt;&lt;BR /&gt; retval |= DftiCreateDescriptor(&amp;amp;ds1, DFTI_SINGLE, DFTI_REAL, 3, sizes);&lt;BR /&gt;&lt;BR /&gt; double scale, total;&lt;BR /&gt; total = sizes[0] * sizes[1] * sizes[2];&lt;BR /&gt; scale = 1;&lt;BR /&gt; retval |= DftiSetValue(ds1, DFTI_FORWARD_SCALE, scale);&lt;BR /&gt; retval |= DftiSetValue(ds1, DFTI_PACKED_FORMAT, DFTI_CCE_FORMAT);&lt;BR /&gt; retval |= DftiSetValue(ds1, DFTI_INPUT_STRIDES, strides_in);&lt;BR /&gt; retval |= DftiSetValue(ds1, DFTI_OUTPUT_STRIDES, strides_out);&lt;BR /&gt; retval |= DftiSetValue(ds1, DFTI_CONJUGATE_EVEN_STORAGE, DFTI_COMPLEX_COMPLEX);&lt;BR /&gt; retval |= DftiSetValue(ds1, DFTI_REAL_STORAGE, DFTI_REAL_REAL);&lt;BR /&gt; retval |= DftiCommitDescriptor(ds1);&lt;BR /&gt; if(retval != DFTI_NO_ERROR)&lt;BR /&gt; return -1;&lt;BR /&gt;&lt;BR /&gt; retval |= DftiComputeForward( ds1, (p));&lt;BR /&gt;&lt;BR /&gt; retval |= DftiFreeDescriptor(&amp;amp;ds1);&lt;BR /&gt; if(retval != DFTI_NO_ERROR)&lt;BR /&gt; return -1;&lt;BR /&gt;&lt;BR /&gt;The sizes are for example: NX=514, NY=512, NZ=64, NXY = NX*NY&lt;BR /&gt;&lt;BR /&gt;Thank you,&lt;BR /&gt;J.&lt;BR /&gt;</description>
      <pubDate>Tue, 24 Feb 2009 08:07:38 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Storage-in-memory-of-CCE-format-for-3d-fft-in-C/m-p/896128#M10878</guid>
      <dc:creator>saleslim_cz</dc:creator>
      <dc:date>2009-02-24T08:07:38Z</dc:date>
    </item>
    <item>
      <title>Re: Storage in memory of CCE format for 3d fft in C</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Storage-in-memory-of-CCE-format-for-3d-fft-in-C/m-p/896129#M10879</link>
      <description>&lt;DIV style="margin:0px;"&gt;&lt;/DIV&gt;
&lt;BR /&gt;Hi J.,&lt;BR /&gt;&lt;BR /&gt;Suppose we have NX*NY*NZ block of real numbers that we want to apply real-to-CCE to. Let's assume that on input, real element X(nx,ny,nz) is located somewhere in array 'double *ds1'. This 'somewhere' can be expressed precisely as&lt;BR /&gt;#define X(nx,ny,nz) ds1[strides_in[0] + nx*strides_in[1] + ny*strides_in[2] + nz*strides_in[3]]&lt;BR /&gt;&lt;BR /&gt;After we apply the transform, we'll get the result which is NX*NY*(NZ/2+1) complex numbers. Assume we have them, denoted as Y,stored in another array 'complex *ds2', then we can describe this as:&lt;BR /&gt;#define Y(nx,ny,nz) ds2[stride_out[0] + nx*strides_out[1] + ny*strides_out[2] + nz*strides_out[3]].&lt;BR /&gt;Please noticedifferent pointer type for the frequency domain: it is complex, not real. Also, nz in the backward domain runs from 0 to NZ/2-1, because CCE only keeps ~half of the frequency domain data (you can restore the remaining data using CCE symmetry).&lt;BR /&gt;&lt;BR /&gt;For out-of-place transform (defined by DFTI_PLACEMENT configuration value) the values of strides_in andstrides_outcan be defined independently. For in-place transform, they should be correlated, to ensure in-placeness. Typically this is attained bymaking surethat &amp;amp;X(i,j,0) == &amp;amp;Y(i,j,0), for all i,j (the rows numbered by the last index are transformed real-to-CCE, that is NZ real numbers to NZ/2+1 complex numbers).&lt;BR /&gt;&lt;BR /&gt;I hope this will help.&lt;BR /&gt;Dima</description>
      <pubDate>Tue, 24 Feb 2009 10:18:19 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Storage-in-memory-of-CCE-format-for-3d-fft-in-C/m-p/896129#M10879</guid>
      <dc:creator>Dmitry_B_Intel</dc:creator>
      <dc:date>2009-02-24T10:18:19Z</dc:date>
    </item>
    <item>
      <title>Re: Storage in memory of CCE format for 3d fft in C</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Storage-in-memory-of-CCE-format-for-3d-fft-in-C/m-p/896130#M10880</link>
      <description>&lt;DIV style="margin:0px;"&gt;
&lt;DIV id="quote_reply" style="width: 100%; margin-top: 5px;"&gt;
&lt;DIV style="margin-left:2px;margin-right:2px;"&gt;Quoting - &lt;A href="https://community.intel.com/en-us/profile/93647"&gt;Dmitry Baksheev (Intel)&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV style="background-color:#E5E5E5; padding:5px;border: 1px; border-style: inset;margin-left:2px;margin-right:2px;"&gt;&lt;EM&gt; &lt;BR /&gt;Hi J.,&lt;BR /&gt;&lt;BR /&gt;Suppose we have NX*NY*NZ block of real numbers that we want to apply real-to-CCE to. Let's assume that on input, real element X(nx,ny,nz) is located somewhere in array 'double *ds1'. This 'somewhere' can be expressed precisely as&lt;BR /&gt;#define X(nx,ny,nz) ds1[strides_in[0] + nx*strides_in[1] + ny*strides_in[2] + nz*strides_in[3]]&lt;BR /&gt;&lt;BR /&gt;After we apply the transform, we'll get the result which is NX*NY*(NZ/2+1) complex numbers. Assume we have them, denoted as Y,stored in another array 'complex *ds2', then we can describe this as:&lt;BR /&gt;#define Y(nx,ny,nz) ds2[stride_out[0] + nx*strides_out[1] + ny*strides_out[2] + nz*strides_out[3]].&lt;BR /&gt;Please noticedifferent pointer type for the frequency domain: it is complex, not real. Also, nz in the backward domain runs from 0 to NZ/2-1, because CCE only keeps ~half of the frequency domain data (you can restore the remaining data using CCE symmetry).&lt;BR /&gt;&lt;BR /&gt;For out-of-place transform (defined by DFTI_PLACEMENT configuration value) the values of strides_in andstrides_outcan be defined independently. For in-place transform, they should be correlated, to ensure in-placeness. Typically this is attained bymaking surethat &amp;amp;X(i,j,0) == &amp;amp;Y(i,j,0), for all i,j (the rows numbered by the last index are transformed real-to-CCE, that is NZ real numbers to NZ/2+1 complex numbers).&lt;BR /&gt;&lt;BR /&gt;I hope this will help.&lt;BR /&gt;Dima&lt;/EM&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;BR /&gt;Thank you very much, that is what I needed to know.&lt;BR /&gt;With regards,&lt;BR /&gt;Jan&lt;BR /&gt;</description>
      <pubDate>Tue, 24 Feb 2009 11:30:39 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/Storage-in-memory-of-CCE-format-for-3d-fft-in-C/m-p/896130#M10880</guid>
      <dc:creator>saleslim_cz</dc:creator>
      <dc:date>2009-02-24T11:30:39Z</dc:date>
    </item>
  </channel>
</rss>

