<?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 Offloading 2d arrays in C/C++ using pragmas - problems in Software Archive</title>
    <link>https://community.intel.com/t5/Software-Archive/Offloading-2d-arrays-in-C-C-using-pragmas-problems/m-p/948542#M18957</link>
    <description>&lt;P&gt;I'm trying to offload a dynamically allocated 2d array of floats. I can't seem to get it to work however. My code is this:&lt;/P&gt;
&lt;P&gt;[cpp]&lt;BR /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;BR /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;BR /&gt;&lt;BR /&gt;float **alloc_2d(int rows, int cols);&lt;BR /&gt;void dealloc_2d(float **array, int rows);&lt;BR /&gt;&lt;BR /&gt;int main()&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* array size */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const int d1 = 10;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const int d2 = 10;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* malloc some 2d c arrays */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float **x;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = alloc_2d(d1,d2);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* assign some values to them */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i,j;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;d1; i++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (j=0; j&amp;lt;d2; j++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x&lt;I&gt;&lt;J&gt; = i*j;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("x[0][0] = %f\n", x[0][0]);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* offload to the mic and check value there */&lt;BR /&gt;#pragma offload target(mic:0) in( x[0:d1][0:d2] : alloc( x[0:d1][0:d2] ) )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("x[0][0] = %f\n", x[0][0]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dealloc_2d(x, d1);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;float **alloc_2d(int rows, int cols)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float **array;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; array = malloc( rows * sizeof *array );&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;rows; i++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array&lt;I&gt; = malloc( cols * sizeof *array&lt;I&gt; );&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return array;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;void dealloc_2d(float **array, int rows)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;rows; i++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(array&lt;I&gt;);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(array);&lt;BR /&gt;}&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P&gt;[/cpp]&lt;/P&gt;
&lt;P&gt;I compile with &lt;EM&gt;icc main.c &lt;/EM&gt;and I get the error:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;": internal error: backend signals&lt;/EM&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;EM&gt;compilation aborted for main.c (code 4)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;What's the correct way to offload multidimensional arrays in C/C++? Would it be wiser to just store my data as a 1D array and compute the memory locations manually?&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
    <pubDate>Fri, 12 Jul 2013 12:53:27 GMT</pubDate>
    <dc:creator>james_B_8</dc:creator>
    <dc:date>2013-07-12T12:53:27Z</dc:date>
    <item>
      <title>Offloading 2d arrays in C/C++ using pragmas - problems</title>
      <link>https://community.intel.com/t5/Software-Archive/Offloading-2d-arrays-in-C-C-using-pragmas-problems/m-p/948542#M18957</link>
      <description>&lt;P&gt;I'm trying to offload a dynamically allocated 2d array of floats. I can't seem to get it to work however. My code is this:&lt;/P&gt;
&lt;P&gt;[cpp]&lt;BR /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;BR /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;BR /&gt;&lt;BR /&gt;float **alloc_2d(int rows, int cols);&lt;BR /&gt;void dealloc_2d(float **array, int rows);&lt;BR /&gt;&lt;BR /&gt;int main()&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* array size */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const int d1 = 10;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; const int d2 = 10;&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* malloc some 2d c arrays */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float **x;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = alloc_2d(d1,d2);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* assign some values to them */&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i,j;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;d1; i++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (j=0; j&amp;lt;d2; j++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x&lt;I&gt;&lt;J&gt; = i*j;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("x[0][0] = %f\n", x[0][0]);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* offload to the mic and check value there */&lt;BR /&gt;#pragma offload target(mic:0) in( x[0:d1][0:d2] : alloc( x[0:d1][0:d2] ) )&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("x[0][0] = %f\n", x[0][0]);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dealloc_2d(x, d1);&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;float **alloc_2d(int rows, int cols)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; float **array;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; array = malloc( rows * sizeof *array );&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;rows; i++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; array&lt;I&gt; = malloc( cols * sizeof *array&lt;I&gt; );&lt;BR /&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return array;&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;void dealloc_2d(float **array, int rows)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;rows; i++)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(array&lt;I&gt;);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; free(array);&lt;BR /&gt;}&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/J&gt;&lt;/I&gt;&lt;/P&gt;
&lt;P&gt;[/cpp]&lt;/P&gt;
&lt;P&gt;I compile with &lt;EM&gt;icc main.c &lt;/EM&gt;and I get the error:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;": internal error: backend signals&lt;/EM&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;EM&gt;compilation aborted for main.c (code 4)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;What's the correct way to offload multidimensional arrays in C/C++? Would it be wiser to just store my data as a 1D array and compute the memory locations manually?&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 12 Jul 2013 12:53:27 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Offloading-2d-arrays-in-C-C-using-pragmas-problems/m-p/948542#M18957</guid>
      <dc:creator>james_B_8</dc:creator>
      <dc:date>2013-07-12T12:53:27Z</dc:date>
    </item>
    <item>
      <title>Quote:James B. wrote:</title>
      <link>https://community.intel.com/t5/Software-Archive/Offloading-2d-arrays-in-C-C-using-pragmas-problems/m-p/948543#M18958</link>
      <description>&lt;P&gt;&lt;/P&gt;&lt;BLOCKQUOTE&gt;James B. wrote:&lt;BR /&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;What's the correct way to offload multidimensional arrays in C/C++? Would it be wiser to just store my data as a 1D array and compute the memory locations manually?&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Yes. You cannot offload a pointer to a point with a #pragma offload directive. The best solution is malloc a single block of memory and set up the pointers later. You will need an array of pointers on the host and a separate one on the coprocessor because the actual addresses will be different.&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 12 Jul 2013 17:36:28 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Offloading-2d-arrays-in-C-C-using-pragmas-problems/m-p/948543#M18958</guid>
      <dc:creator>Frances_R_Intel</dc:creator>
      <dc:date>2013-07-12T17:36:28Z</dc:date>
    </item>
    <item>
      <title>Good. Thanks for confirming</title>
      <link>https://community.intel.com/t5/Software-Archive/Offloading-2d-arrays-in-C-C-using-pragmas-problems/m-p/948544#M18959</link>
      <description>&lt;P&gt;Good. Thanks for confirming that for me.&lt;/P&gt;</description>
      <pubDate>Fri, 12 Jul 2013 17:50:00 GMT</pubDate>
      <guid>https://community.intel.com/t5/Software-Archive/Offloading-2d-arrays-in-C-C-using-pragmas-problems/m-p/948544#M18959</guid>
      <dc:creator>james_B_8</dc:creator>
      <dc:date>2013-07-12T17:50:00Z</dc:date>
    </item>
  </channel>
</rss>

