[Openmp-dev] Possible misuse of libomptarget plugin interface

Johannes Doerfert via Openmp-dev openmp-dev at lists.llvm.org
Sun Feb 14 10:33:26 PST 2021


I accidentally dropped the list in my earlier reply.

The conclusion is this is a bug, proposed fix is here:
   https://reviews.llvm.org/D96667

~ Johannes


On 2/11/21 4:19 PM, Guilherme Valarini via Openmp-dev wrote:
> Hi everyone,
>
> I am part of a team that is currently developing a new device target for
> libomptarget. We came across some strange behavior from the target agnostic
> layer and through some digging we have found two possible misuses of the
> plugin interface for the async functions (quoted below). In both cases, the
> address to a local variable is passed as the host data to be copied to the
> target device, but since this function can be asynchronously executed, such
> variables can get out of scope when the actual submission is done.
>
> Is there anyone that could check if this is an actual issue with the target
> agnostic layer? I could have sent a bug report but since I actually do not
> know if this is actually a problem, I thought it would be better to report
> it here first .
>
> File: openmp/libomptarget/src/omptarget.cpp:419
>
>> if (arg_types[i] & OMP_TGT_MAPTYPE_PTR_AND_OBJ && !IsHostPtr) {
>>    DP("Update pointer (" DPxMOD ") -> [" DPxMOD "]\n",
>>        DPxPTR(PointerTgtPtrBegin), DPxPTR(TgtPtrBegin));
>>    uint64_t Delta = (uint64_t)HstPtrBegin - (uint64_t)HstPtrBase;
>>    void *TgtPtrBase = (void *)((uint64_t)TgtPtrBegin - Delta);
>>    int rt = Device.submitData(PointerTgtPtrBegin, &TgtPtrBase,
>>                                sizeof(void *), async_info_ptr);
>>    if (rt != OFFLOAD_SUCCESS) {
>>      REPORT("Copying data to device failed.\n");
>>      return OFFLOAD_FAIL;
>>    }
>>    // create shadow pointers for this entry
>>    Device.ShadowMtx.lock();
>>    Device.ShadowPtrMap[Pointer_HstPtrBegin] = {
>>        HstPtrBase, PointerTgtPtrBegin, TgtPtrBase};
>>    Device.ShadowMtx.unlock();
>> }
>>
> File: openmp/libomptarget/src/omptarget.cpp:1141
>
>> DP("Parent lambda base " DPxMOD "\n", DPxPTR(TgtPtrBase));
>> uint64_t Delta = (uint64_t)HstPtrBegin - (uint64_t)HstPtrBase;
>> void *TgtPtrBegin = (void *)((uintptr_t)TgtPtrBase + Delta);
>> void *PointerTgtPtrBegin = Device.getTgtPtrBegin(
>>      HstPtrVal, ArgSizes[I], IsLast, false, IsHostPtr);
>> if (!PointerTgtPtrBegin) {
>>    DP("No lambda captured variable mapped (" DPxMOD ") - ignored\n",
>>        DPxPTR(HstPtrVal));
>>    continue;
>> }
>> if (PM->RTLs.RequiresFlags & OMP_REQ_UNIFIED_SHARED_MEMORY &&
>>      TgtPtrBegin == HstPtrBegin) {
>>    DP("Unified memory is active, no need to map lambda captured"
>>        "variable (" DPxMOD ")\n",
>>        DPxPTR(HstPtrVal));
>>    continue;
>> }
>> DP("Update lambda reference (" DPxMOD ") -> [" DPxMOD "]\n",
>>      DPxPTR(PointerTgtPtrBegin), DPxPTR(TgtPtrBegin));
>> Ret = Device.submitData(TgtPtrBegin, &PointerTgtPtrBegin,
>>                          sizeof(void *), AsyncInfo);
>> if (Ret != OFFLOAD_SUCCESS) {
>>    REPORT("Copying data to device failed.\n");
>>    return OFFLOAD_FAIL;
>> }
>
> Note: We already came up with a way of fixing the first case by first
> storing TgtPtrBase in the shadow map and passing a pointer to the correct
> map member (which will live long enough for the async function to complete)
> instead of the local variable. But the second case is a little bit trickier
> to fix without any additional data added to the target agnostic structures.
>
> Thanks in advance!
>
>
> _______________________________________________
> Openmp-dev mailing list
> Openmp-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/openmp-dev


More information about the Openmp-dev mailing list