<div dir="ltr">Yes, with -fno-rtti it does.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jan 16, 2020 at 10:34 AM Doerfert, Johannes <<a href="mailto:jdoerfert@anl.gov">jdoerfert@anl.gov</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This works with -fno-rtti, correct? It should work either way but I am<br>
just curious.<br>
<br>
On 01/16, Itaru Kitayama wrote:<br>
> Today's Trunk can not build below code:<br>
> <br>
>  #include <stdio.h><br>
> <br>
> class AbsBase {<br>
> public:<br>
> virtual int f(int&) = 0;<br>
> };<br>
> <br>
> class Derived : public AbsBase {<br>
> private:<br>
> int d_;<br>
> public:<br>
> int f(int &x) { return d_ = x; }<br>
> <br>
> };<br>
> <br>
> int main() {<br>
> #pragma omp target parallel for<br>
> for (int i=0;i<10;i++) {<br>
> int x=123;<br>
> Derived d;<br>
> printf("%d\n",d.f(x));<br>
> }<br>
> }<br>
> <br>
> [kitayama1@juronc12 pcp0151]$ clang++ -g -fopenmp -fopenmp-targets=nvptx64<br>
> test2.cpp<br>
> nvlink error   : Undefined reference to<br>
> '_ZTVN10__cxxabiv117__class_type_infoE' in '/tmp/test2-515e4a.cubin'<br>
> nvlink error   : Undefined reference to<br>
> '_ZTVN10__cxxabiv120__si_class_type_infoE' in '/tmp/test2-515e4a.cubin'<br>
> clang-11: error: nvlink command failed with exit code 255 (use -v to see<br>
> invocation)<br>
> <br>
> On Wed, Jan 15, 2020 at 11:31 PM Alexey Bataev <<a href="mailto:a.bataev@hotmail.com" target="_blank">a.bataev@hotmail.com</a>> wrote:<br>
> <br>
> > Yes, it works, since you're actually don't use mapped data. Instead you<br>
> > create the local one, which can be used directly without any issues. Local<br>
> > objects should work fine,but not the mapped ones.<br>
> ><br>
> > Best regards,<br>
> > Alexey Bataev<br>
> ><br>
> > 14 янв. 2020 г., в 23:17, Itaru Kitayama <<a href="mailto:itaru.kitayama@gmail.com" target="_blank">itaru.kitayama@gmail.com</a>><br>
> > написал(а):<br>
> ><br>
> > <br>
> > #include <stdio.h><br>
> ><br>
> > class Base {<br>
> > public:<br>
> >         virtual int f() { return 2;}<br>
> > };<br>
> > class D : public Base {<br>
> > public:<br>
> >         int f() { return 1234; }<br>
> > };<br>
> ><br>
> > int main() {<br>
> >         D *d = new D();<br>
> > #pragma omp target parallel for map(to: d[0:1])<br>
> >         for (int i=0;i<10;i++) {<br>
> >                 D d1(*d);<br>
> >                 printf("arr[0] is %d\n", d1.f());<br>
> >         }<br>
> > }<br>
> ><br>
> > The above works even though an instance of class D is not a trivially<br>
> > mappable type.<br>
> ><br>
> > On Wed, Jan 15, 2020 at 2:32 PM Alexey Bataev <<a href="mailto:a.bataev@hotmail.com" target="_blank">a.bataev@hotmail.com</a>><br>
> > wrote:<br>
> ><br>
> >> And it should fail since you're mapping non trivially copyable type.<br>
> >><br>
> >> Best regards,<br>
> >> Alexey Bataev<br>
> >><br>
> >> 14 янв. 2020 г., в 19:14, Itaru Kitayama <<a href="mailto:itaru.kitayama@gmail.com" target="_blank">itaru.kitayama@gmail.com</a>><br>
> >> написал(а):<br>
> >><br>
> >> <br>
> >> This piece of C++ program execution fails at run time.<br>
> >><br>
> >> #include <stdio.h><br>
> >><br>
> >> class AbsBase {<br>
> >> public:<br>
> >>         virtual int f() = 0;<br>
> >> };<br>
> >><br>
> >> class Derived : public AbsBase {<br>
> >> private:<br>
> >>         int *arr = new int[100];<br>
> >> public:<br>
> >>         int f() { return arr[0]; }<br>
> >>         void fillarray() {<br>
> >>                 arr[0] = 1234;<br>
> >>         }<br>
> >> };<br>
> >><br>
> >> int main() {<br>
> >>         AbsBase *absBase = new Derived();<br>
> >>         static_cast<Derived*>(absBase)->fillarray();<br>
> >> #pragma omp target parallel for map(to: absBase[0:1])<br>
> >>         for (int i=0;i<10;i++) {<br>
> >>                 Derived d1(*static_cast<Derived*>(absBase));<br>
> >>                 printf("arr[0] is %d\n", d1.f());<br>
> >>         }<br>
> >> }<br>
> >><br>
> >> On Sun, Jan 12, 2020 at 1:45 PM Doerfert, Johannes <<a href="mailto:jdoerfert@anl.gov" target="_blank">jdoerfert@anl.gov</a>><br>
> >> wrote:<br>
> >><br>
> >>> On 01/12, Itaru Kitayama wrote:<br>
> >>> > Do you guys have a timeframe for that feature<br>
> >>> > Implemented?<br>
> >>><br>
> >>> I do not and I don't know anyone who will drive this right now.<br>
> >>><br>
> >>> As mentioned before, you should be able to "move/copy-create" the<br>
> >>> elements on the device in order to use virtual functions.<br>
> >>><br>
> >>><br>
> >>> > On Sun, Jan 12, 2020 at 12:51 Doerfert, Johannes <<a href="mailto:jdoerfert@anl.gov" target="_blank">jdoerfert@anl.gov</a>><br>
> >>> wrote:<br>
> >>> ><br>
> >>> > > On 01/11, Alexey Bataev via Openmp-dev wrote:<br>
> >>> > > > Virtual functions are not supported.<br>
> >>> > ><br>
> >>> > > Not yet ;).<br>
> >>> > ><br>
> >>> > > We'll get it with 5.1 so we might actually implement it soon. Till<br>
> >>> then,<br>
> >>> > > you have to create the object on the device you call the virtual<br>
> >>> > > function.<br>
> >>> > ><br>
> >>><br>
> >>> --<br>
> >>><br>
> >>> Johannes Doerfert<br>
> >>> Researcher<br>
> >>><br>
> >>> Argonne National Laboratory<br>
> >>> Lemont, IL 60439, USA<br>
> >>><br>
> >>> <a href="mailto:jdoerfert@anl.gov" target="_blank">jdoerfert@anl.gov</a><br>
> >>><br>
> >><br>
<br>
-- <br>
<br>
Johannes Doerfert<br>
Researcher<br>
<br>
Argonne National Laboratory<br>
Lemont, IL 60439, USA<br>
<br>
<a href="mailto:jdoerfert@anl.gov" target="_blank">jdoerfert@anl.gov</a><br>
</blockquote></div>