<?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:SYCL_EXTERNAL issue when separating defitions from declarations of a named function object in Intel® oneAPI DPC++/C++ Compiler</title>
    <link>https://community.intel.com/t5/Intel-oneAPI-DPC-C-Compiler/SYCL-EXTERNAL-issue-when-separating-defitions-from-declarations/m-p/1458525#M2842</link>
    <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Thanks for accepting our solution. If you need any additional information, please post a new question as this thread will no longer be monitored by Intel.&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Thanks and Regards,&lt;/P&gt;&lt;P&gt;Pendyala Sesha Srinivas&lt;/P&gt;&lt;BR /&gt;</description>
    <pubDate>Thu, 23 Feb 2023 05:37:52 GMT</pubDate>
    <dc:creator>SeshaP_Intel</dc:creator>
    <dc:date>2023-02-23T05:37:52Z</dc:date>
    <item>
      <title>SYCL_EXTERNAL issue when separating defitions from declarations of a named function object</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-DPC-C-Compiler/SYCL-EXTERNAL-issue-when-separating-defitions-from-declarations/m-p/1457754#M2837</link>
      <description>&lt;P&gt;Hello,&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I'm new to C++ SYCL. I got the&amp;nbsp;SYCL_EXTERNAL issue:&lt;/P&gt;
&lt;P&gt;"error : SYCL kernel cannot call an undefined function without SYCL_EXTERNAL attribute"&lt;/P&gt;
&lt;P&gt;when using a named function object as kernel and trying to separate definitions from declarations in a *.cpp file&lt;/P&gt;
&lt;P&gt;The project is built on Visual Studio 2022 under Win11. Intel oneAPI version 2023.0. Below is the code. Hope anyone could help me get the code run.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks so much!&lt;/P&gt;
&lt;P&gt;Best regards&lt;/P&gt;
&lt;P&gt;PC&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;"my_class.h" file_________________________________&lt;/P&gt;
&lt;P&gt;#ifndef MY_CLASS_H&lt;BR /&gt;#define MY_CLASS_H&lt;BR /&gt;#pragma once&lt;/P&gt;
&lt;P&gt;#include &amp;lt;CL/sycl.hpp&amp;gt;&lt;/P&gt;
&lt;P&gt;class my_class {&lt;BR /&gt;&lt;BR /&gt;private:&lt;BR /&gt;sycl::accessor&amp;lt;int&amp;gt; inputValues;&lt;/P&gt;
&lt;P&gt;public:&lt;BR /&gt;//Member functions&lt;BR /&gt;//Constructors &amp;amp; Destructors&lt;BR /&gt;my_class(const sycl::accessor&amp;lt;int&amp;gt;&amp;amp; in_Val);&lt;/P&gt;
&lt;P&gt;my_class() = default;&lt;BR /&gt;my_class(const my_class&amp;amp; rhs) = default;&lt;BR /&gt;my_class(my_class&amp;amp;&amp;amp; rhs) noexcept = default;&lt;BR /&gt;~my_class() = default;&lt;/P&gt;
&lt;P&gt;//Assignment&lt;BR /&gt;my_class&amp;amp; operator = (const my_class&amp;amp; rhs) = default;&lt;BR /&gt;my_class&amp;amp; operator = (my_class&amp;amp;&amp;amp; rhs) noexcept = default;&lt;/P&gt;
&lt;P&gt;//Methods&lt;BR /&gt;void operator()(sycl::nd_item&amp;lt;1&amp;gt; it, auto&amp;amp; sum) const;&lt;BR /&gt;};&lt;BR /&gt;#endif&lt;/P&gt;
&lt;P&gt;__________________________________________________&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;"my_class.cpp" file_________________________________&lt;/P&gt;
&lt;P&gt;#include "pch.h"&lt;/P&gt;
&lt;P&gt;my_class::my_class(const sycl::accessor&amp;lt;int&amp;gt;&amp;amp; in_Val) :inputValues(in_Val) {&lt;/P&gt;
&lt;P&gt;};&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;//Methods&lt;BR /&gt;void my_class::operator()(sycl::nd_item&amp;lt;1&amp;gt; it, auto&amp;amp; sum) const {&lt;BR /&gt;size_t idx = it.get_global_id(0);&lt;BR /&gt;sum += inputValues[idx];&lt;BR /&gt;};&lt;/P&gt;
&lt;P&gt;________________________________________________________&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;"main.cpp" file________________________________&lt;/P&gt;
&lt;P&gt;int main(){&lt;/P&gt;
&lt;P&gt;using namespace std;&lt;/P&gt;
&lt;P&gt;size_t N = 1024;&lt;BR /&gt;size_t L = 256;&lt;/P&gt;
&lt;P&gt;sycl::buffer&amp;lt;int&amp;gt; valuesBuf(N);&lt;BR /&gt;{&lt;BR /&gt;sycl::host_accessor a(valuesBuf, sycl::write_only);&lt;BR /&gt;for (int i = 0; i &amp;lt; N; i++) {&lt;BR /&gt;a[i] = i;&lt;BR /&gt;}&lt;BR /&gt;//destruct host_accessor&lt;BR /&gt;}&lt;/P&gt;
&lt;P&gt;int sumResult = 0;&lt;BR /&gt;sycl::buffer&amp;lt;int&amp;gt; sumBuf(&amp;amp;sumResult, 1);&lt;/P&gt;
&lt;P&gt;sycl::queue Q(sycl::gpu_selector_v);&lt;/P&gt;
&lt;P&gt;Q.submit([&amp;amp;](sycl::handler&amp;amp; cgh) {&lt;/P&gt;
&lt;P&gt;auto inputValues = valuesBuf.get_access(cgh);&lt;BR /&gt;auto sumReduction = sycl::reduction(sumBuf, cgh, sycl::plus&amp;lt;&amp;gt;());&lt;/P&gt;
&lt;P&gt;my_class m_class(inputValues);&lt;BR /&gt;cgh.parallel_for(sycl::nd_range&amp;lt;1&amp;gt; {N, L}, sumReduction, m_class);&lt;BR /&gt;});&lt;/P&gt;
&lt;P&gt;int sum = numeric_limits&amp;lt;int&amp;gt;::max();&lt;BR /&gt;{&lt;BR /&gt;sycl::host_accessor sumBuf_hacc(sumBuf, sycl::read_only);&lt;BR /&gt;sum = sumBuf_hacc[0];&lt;BR /&gt;}&lt;/P&gt;
&lt;P&gt;std::cout &amp;lt;&amp;lt; "sum is " &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; endl;&lt;BR /&gt;return;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 21 Feb 2023 02:28:30 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-DPC-C-Compiler/SYCL-EXTERNAL-issue-when-separating-defitions-from-declarations/m-p/1457754#M2837</guid>
      <dc:creator>PC-1</dc:creator>
      <dc:date>2023-02-21T02:28:30Z</dc:date>
    </item>
    <item>
      <title>Re: SYCL_EXTERNAL issue when separating defitions from declarations of a named function object</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-DPC-C-Compiler/SYCL-EXTERNAL-issue-when-separating-defitions-from-declarations/m-p/1458297#M2841</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you for posting in Intel Communities.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Please find the below modified DPC++ source file which is executing without any errors in Visual Studio 17 2022.&lt;/P&gt;
&lt;LI-CODE lang="markup"&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;CL/sycl.hpp&amp;gt;
#include &amp;lt;numeric&amp;gt;
#include &amp;lt;limits&amp;gt;

using namespace sycl;
using namespace std;

int main()
{
    size_t N = 1024;
    size_t L = 256;

    sycl::buffer&amp;lt;int&amp;gt; valuesBuf(N);
    {
        sycl::host_accessor a(valuesBuf, sycl::write_only);
        for (int i = 0; i &amp;lt; N; i++)
        {
            a[i] = i;
        }
        //destruct host_accessor
    }

    int sumResult = 0;
    sycl::buffer&amp;lt;int&amp;gt; sumBuf(&amp;amp;sumResult, 1);
    sycl::queue Q(sycl::gpu_selector_v);


    Q.submit([&amp;amp;](sycl::handler&amp;amp; cgh) {

        auto inputValues = valuesBuf.get_access(cgh);
    auto sumReduction = sycl::reduction(sumBuf, cgh, sycl::plus&amp;lt;&amp;gt;());

    cgh.parallel_for(sycl::nd_range&amp;lt;1&amp;gt; {N, L}, sumReduction, [=](nd_item&amp;lt;1&amp;gt; it, auto&amp;amp; sum) {
        size_t idx = it.get_global_id(0);
    sum += inputValues[idx];
        });
        });


    int sum = numeric_limits&amp;lt;int&amp;gt;::max();
    {
        sycl::host_accessor sumBuf_hacc(sumBuf, sycl::read_only);
        sum = sumBuf_hacc[0];
    }

    std::cout &amp;lt;&amp;lt; "sum is " &amp;lt;&amp;lt; sum &amp;lt;&amp;lt; "\n";

    return 0;
}
&lt;/LI-CODE&gt;
&lt;P&gt;If you still facing the same error, try to build the project in Release(x64) mode.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I can observe that you are trying to call the function inside the kernel that is defined in a different translational unit. If you want to define a function then you need to make sure that the function is present in the same translation unit. Those functions need to be labeled with SYCL_EXTERNAL.&lt;/P&gt;
&lt;P&gt;Please refer to the Data Parallel C++ textbook by James Reinders (Chapter 13) for more information.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks and Regards,&lt;/P&gt;
&lt;P&gt;Pendyala Sesha Srinivas&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 22 Feb 2023 16:56:18 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-DPC-C-Compiler/SYCL-EXTERNAL-issue-when-separating-defitions-from-declarations/m-p/1458297#M2841</guid>
      <dc:creator>SeshaP_Intel</dc:creator>
      <dc:date>2023-02-22T16:56:18Z</dc:date>
    </item>
    <item>
      <title>Re:SYCL_EXTERNAL issue when separating defitions from declarations of a named function object</title>
      <link>https://community.intel.com/t5/Intel-oneAPI-DPC-C-Compiler/SYCL-EXTERNAL-issue-when-separating-defitions-from-declarations/m-p/1458525#M2842</link>
      <description>&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Thanks for accepting our solution. If you need any additional information, please post a new question as this thread will no longer be monitored by Intel.&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&lt;/P&gt;&lt;P&gt;Thanks and Regards,&lt;/P&gt;&lt;P&gt;Pendyala Sesha Srinivas&lt;/P&gt;&lt;BR /&gt;</description>
      <pubDate>Thu, 23 Feb 2023 05:37:52 GMT</pubDate>
      <guid>https://community.intel.com/t5/Intel-oneAPI-DPC-C-Compiler/SYCL-EXTERNAL-issue-when-separating-defitions-from-declarations/m-p/1458525#M2842</guid>
      <dc:creator>SeshaP_Intel</dc:creator>
      <dc:date>2023-02-23T05:37:52Z</dc:date>
    </item>
  </channel>
</rss>

