https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118518

            Bug ID: 118518
           Summary: gcc 14.2.1 nvptx cross compiler complains about alias
                    definitions in a struct with two constructors that are
                    not aliases
           Product: gcc
           Version: 14.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: schulz.benjamin at googlemail dot com
  Target Milestone: ---

Created attachment 60176
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60176&action=edit
mdspan template classes

Hi there,

I tried to write my own version of the new mdspan class, but one which works
with non-compile time extents (i.e. which can be set by the input) and with gpu
offload support. The following c++23 code contains interesting algorithms for
matrix multiplication (Strassen Algorithm, and Winograd version of the Strassen
Algorithm) as well as some advanced and new algorithms for Cholesky, LU and QR
decomposition. It has two interfaces, one that uses the stl, with functions
that can work on gpu and may offload parts of the code at gpu, and another with
functions that can entirely reside on gpu.

It is certainly a bit more advanced than small openmp test cases. It uses
target teams, parallel for and simd instructions, as well as declare target
areas with functions on the target, memory allocation, pointer arithmetic for
sub-arrays.

It thus represents a nice compiler test. On clang, it compiles at least. but
the function offload fails for some reason on clang. and the winograd version
has, in clang, a problem with the omp runtime.

On gcc, it does not even compile.

the options:

-fopenmp -foffload=nvptx-none  -fcf-protection=none -fno-stack-protector 
-std=c++23  -no-pie lrt lm lc lstdc++ 

make gcc claim that "alias definitions" would not be allowed in this
configuration...


[100%] Linking CXX executable arraytest
/usr/bin/cmake -E cmake_link_script CMakeFiles/arraytest.dir/link.txt
--verbose=1
/home/benni/projects/arraylibrary/mdspan.h:356:22: Fehler: Alias-Definitionen
werden in dieser Konfiguration nicht unterstützt
  356 | template<typename T> datastruct<T>::datastruct(
      |                      ^
/home/benni/projects/arraylibrary/mdspan.h:386:22: Fehler: Alias-Definitionen
werden in dieser Konfiguration nicht unterstützt
  386 | template<typename T> datastruct<T>::datastruct(
      |                      ^
nvptx mkoffload: schwerwiegender Fehler:
/usr/bin/x86_64-pc-linux-gnu-accel-nvptx-none-gcc gab Ende-Status 1 zurück

but if we look at the sourcecode, we get this, which do not look like aliases.

Probably gcc has difficulties with the offloaded functions which may be aliases
generated by the compiler?




#pragma omp begin declare target
template<typename T> datastruct<T>::datastruct(
    T* data,
    size_t pdatalength,
    bool rowm,
    size_t rank,
    size_t* extents,
    size_t* strides,
    bool compute_datalength,
    bool compute_strides_from_extents
) : pdata(data),
    pextents(extents),
    pstrides(strides),
    pdatalength(pdatalength),
    prank(rank),
    prowmayor(rowm)

{
    if(compute_strides_from_extents==true && pextents!=nullptr &&
pstrides!=nullptr && rank !=0)
    {
        fill_strides(pextents,pstrides,rank,rowm);
    }
    if(compute_datalength==true && pextents!=nullptr && pstrides!=nullptr &&
rank !=0)
    {
        pdatalength=compute_data_length(pextents,pstrides,rank);
    }
}
#pragma omp end declare target


#pragma omp begin declare target
template<typename T> datastruct<T>::datastruct(
    T* data,
    size_t datalength,
    bool rowm,
    size_t rows,
    size_t cols,
    size_t* extents,
    size_t* strides,
    bool compute_datalength,
    bool compute_strides_from_extents
) : pdata(data),
    pextents(extents),
    pstrides(strides),
    pdatalength(datalength),
    prank(2),
    prowmayor(rowm)
{
    if(extents!=nullptr)
    {
        pextents[0]=(rowm==true)?rows:cols;
        pextents[1]=(rowm==true)?cols:rows;
    }
    if(pstrides!=nullptr && compute_strides_from_extents)
    {
        pstrides[0]=(rowm==true)? cols:1;
        pstrides[1]=(rowm==true)?1: rows;
    }
    if(compute_datalength==true && extents!=nullptr && strides!=nullptr)
    {
        pdatalength=(rows-1) * strides[0]+(cols-1)*strides[1]+1;
    }
}
#pragma omp end declare target

#pragma omp begin declare target
template<typename T> datastruct<T>::datastruct(
    T* data,
    size_t datalength,
    bool rowm,
    bool rowvector,
    size_t noelements,
    size_t* extents,
    size_t* strides,
    bool compute_datalength,
    bool compute_strides_from_extents
) : pdata(data),
    pextents(extents),
    pstrides(strides),
    pdatalength(datalength),
    prank(1),
    prowmayor(true)
{
    if(extents!=nullptr)
    {
        pextents[0]=noelements;
    }
    if(pstrides!=nullptr && compute_strides_from_extents)
    {
        if(rowvector)
            pstrides[0]=(rowm==true)? 1:noelements;
        else
            pstrides[0]=(rowm==true)? noelements:1;
    }
    if(compute_datalength==true && strides!=nullptr)
    {
        pdatalength=(noelements-1) * strides[0]+1;
    }
}
#pragma omp end declare target

Reply via email to