Libomptarget fatal error 1: failure of target construct while offloading is mandatory

Hi,
This simple C++ program:

#include

class Abstract {
public:
virtual int f() = 0;
};
class Derived : public Abstract {
public:
int f() { return 1; };
};

int main() {
Abstract *p[10];
for (int i=0;i<10;i++) {
p[i] = new Derived;
}
int sum=0;
#pragma omp target parallel for map(p[:10]) reduction(+: sum)
for (int i=0;i<10;i++) {
sum += p[i]->f();
}
std::cout << "sum " << sum << std::endl;
}

can be built with the offloading flags of Clang and runs fine on host, but on
the device it crashes at runtime leaving the error message:

==60659== NVPROF is profiling process 60659, command: ./a.out
Libomptarget fatal error 1: failure of target construct while offloading is mandatory
==60659== Profiling application: ./a.out
==60659== Warning: 5 records have invalid timestamps due to insufficient device buffer space. You can configure the buffer space using the option --device-buffer-size.
==60659== Warning: 4 records have invalid timestamps due to insufficient semaphore pool size. You can configure the pool size using the option --profiling-semaphore-pool-size.
==60659== Profiling result:
No kernels were profiled.

Does this just indicate the limitation of the current trunk Clang implementation?

Non trivial types are not guaranteed to be offloaded correctly.

Best regards,
Alexey Bataev

Do you mean, depending the type it might be offloaded correctly? Is this situation improved once 5.0 API is supported in trunk?

  1. If the is trivial, it is guaranteed to be offloaded correctly.
  2. No, 5.0 does not add anything like this.

Best regards,
Alexey Bataev

It is worth to note that we are working to support virtual methods in 5.1.
However, it is not voted on yet (afaik) and I doubt it'll make it in the TR9 that is release for SC (Nov).

Also:
  - If you map a non-trivial type but use it only as if it was a trivial one, e.g., no virtual function calls, it should work.
  - If you allocate a non-trivial type on a device (incl. the host) and use it on that device only, it should work.

@Ravi, please correct me if I'm wrong.

Ravi thanks for the confirmation.