<?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>sujet Vectorize function calls dans OpenCL* for CPU</title>
    <link>https://community.intel.com/t5/OpenCL-for-CPU/Vectorize-function-calls/m-p/826328#M1196</link>
    <description>Substituting function body instead of a call has no effect either</description>
    <pubDate>Thu, 10 May 2012 16:22:16 GMT</pubDate>
    <dc:creator>tempatel</dc:creator>
    <dc:date>2012-05-10T16:22:16Z</dc:date>
    <item>
      <title>Vectorize function calls</title>
      <link>https://community.intel.com/t5/OpenCL-for-CPU/Vectorize-function-calls/m-p/826327#M1195</link>
      <description>I have an OpenCL program wich failed to vectorize. Problem is in function in line marked XXX&lt;DIV&gt;&lt;/DIV&gt;&lt;DIV&gt;&lt;DIV&gt;&lt;DIV id="_mcePaste"&gt;int getNumEigensLess(float c, int n, __global float *d, __global float *e, float pivmin) {&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;	&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  float diff = d[0] - c;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  diff = select(diff, -pivmin, fabs(diff) &amp;lt; pivmin);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  int count = select(0, 1, diff &amp;lt;= 0);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt; &lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  for (int j = 1; j &amp;lt; n; ++j) {&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;    diff = d&lt;J&gt; - c - sqr(e[j - 1]) / diff; // XXX here is a problem line&lt;/J&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;    diff = select(diff, -pivmin, fabs(diff) &amp;lt; pivmin);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;    count += select(0, 1, diff &amp;lt;= 0);&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  }&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;  return count;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;}&lt;/DIV&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;I see, that vectorization fails because each successive diff value depends on previous. But there is an another way. As far as I know, all non kernel functions are inlined in OpenCL, so instead of vectorizationgetNumEigensLess itself, compiler can vectorize function calls. Make signature something like&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;B&gt;int4&lt;/B&gt; getNumEigensLess(&lt;B&gt;float4&lt;/B&gt; c, int n, __global float *d, __global float *e, float pivmin)
&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;Obviously I use same n, e, d and pivmin parameters between calls, changing only c.&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;&lt;/DIV&gt;&lt;DIV id="_mcePaste"&gt;How can I change my code, to make compiler vectorize function calls like this?&lt;/DIV&gt;&lt;DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;</description>
      <pubDate>Thu, 10 May 2012 16:15:02 GMT</pubDate>
      <guid>https://community.intel.com/t5/OpenCL-for-CPU/Vectorize-function-calls/m-p/826327#M1195</guid>
      <dc:creator>tempatel</dc:creator>
      <dc:date>2012-05-10T16:15:02Z</dc:date>
    </item>
    <item>
      <title>Vectorize function calls</title>
      <link>https://community.intel.com/t5/OpenCL-for-CPU/Vectorize-function-calls/m-p/826328#M1196</link>
      <description>Substituting function body instead of a call has no effect either</description>
      <pubDate>Thu, 10 May 2012 16:22:16 GMT</pubDate>
      <guid>https://community.intel.com/t5/OpenCL-for-CPU/Vectorize-function-calls/m-p/826328#M1196</guid>
      <dc:creator>tempatel</dc:creator>
      <dc:date>2012-05-10T16:22:16Z</dc:date>
    </item>
  </channel>
</rss>

