unitaryfund / qrack

Comprehensive, GPU accelerated framework for developing universal virtual quantum processors
https://qrack.readthedocs.io/en/latest/
GNU Lesser General Public License v3.0
164 stars 36 forks source link

QBitHybrid compilation error: mismatched allocation function #999

Closed nelimee closed 7 months ago

nelimee commented 7 months ago

The following code line https://github.com/unitaryfund/qrack/blob/8aa75bb8193e5529d6e3dd2f254cfc167a35686a/include/qbdthybrid.hpp#L55 raise an error at compilation:

[  1%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_uint8.cl
[  2%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qengine.cl
[  4%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_alu.cl
[  5%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_bcd.cl
[  6%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_double.cl
[  8%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_float.cl
[  9%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_half.cl
[ 11%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_quad.cl
[ 13%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_uint16.cl
[ 13%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_uint32.cl
[ 15%] Building OpenCL Commands in /home/me/.apps/qrack/src/common/qheader_uint64.cl
[ 16%] Building CXX object CMakeFiles/qrack.dir/src/common/functions.cpp.o
[ 18%] Building CXX object CMakeFiles/qrack.dir/src/common/parallel_for.cpp.o
[ 19%] Building CXX object CMakeFiles/qrack.dir/src/qinterface/gates.cpp.o
[ 20%] Building CXX object CMakeFiles/qrack.dir/src/qinterface/logic.cpp.o
[ 22%] Building CXX object CMakeFiles/qrack.dir/src/qinterface/qinterface.cpp.o
[ 23%] Building CXX object CMakeFiles/qrack.dir/src/qinterface/rotational.cpp.o
[ 26%] Building CXX object CMakeFiles/qrack.dir/src/qengine/arithmetic.cpp.o
[ 26%] Building CXX object CMakeFiles/qrack.dir/src/qengine/qengine.cpp.o
[ 27%] Building CXX object CMakeFiles/qrack.dir/src/qengine/state.cpp.o
[ 29%] Building CXX object CMakeFiles/qrack.dir/src/qengine/utility.cpp.o
[ 30%] Building CXX object CMakeFiles/qrack.dir/src/qengineshard.cpp.o
[ 31%] Building CXX object CMakeFiles/qrack.dir/src/qunit.cpp.o
[ 33%] Building CXX object CMakeFiles/qrack.dir/src/qunitclifford.cpp.o
[ 34%] Building CXX object CMakeFiles/qrack.dir/src/qpager.cpp.o
[ 36%] Building CXX object CMakeFiles/qrack.dir/src/qstabilizer.cpp.o
[ 37%] Building CXX object CMakeFiles/qrack.dir/src/qstabilizerhybrid.cpp.o
[ 38%] Building CXX object CMakeFiles/qrack.dir/src/qcircuit.cpp.o
[ 40%] Building CXX object CMakeFiles/qrack.dir/src/qtensornetwork.cpp.o
[ 41%] Building CXX object CMakeFiles/qrack.dir/src/qbdthybrid.cpp.o
[ 43%] Building CXX object CMakeFiles/qrack.dir/src/common/dispatchqueue.cpp.o
[ 44%] Building CXX object CMakeFiles/qrack.dir/src/qinterface/arithmetic.cpp.o
[ 45%] Building CXX object CMakeFiles/qrack.dir/src/arithmetic_qcircuit.cpp.o
[ 47%] Building CXX object CMakeFiles/qrack.dir/src/qalu.cpp.o
[ 48%] Building CXX object CMakeFiles/qrack.dir/src/qbdt/node_interface.cpp.o
[ 50%] Building CXX object CMakeFiles/qrack.dir/src/qbdt/node.cpp.o
[ 51%] Building CXX object CMakeFiles/qrack.dir/src/qbdt/tree.cpp.o
[ 52%] Building CXX object CMakeFiles/qrack.dir/src/common/oclengine.cpp.o
[ 54%] Building CXX object CMakeFiles/qrack.dir/src/qengine/opencl.cpp.o
[ 55%] Building CXX object CMakeFiles/qrack.dir/src/qhybrid.cpp.o
In file included from /usr/include/c++/13.2.1/memory:78,
                 from /home/me/.apps/qrack/include/common/qrack_types.hpp:25,
                 from /home/me/.apps/qrack/include/common/qrack_functions.hpp:15,
                 from /home/me/.apps/qrack/include/common/parallel_for.hpp:15,
                 from /home/me/.apps/qrack/include/qinterface.hpp:15,
                 from /home/me/.apps/qrack/include/qengine.hpp:15,
                 from /home/me/.apps/qrack/include/qengine_cpu.hpp:15,
                 from /home/me/.apps/qrack/include/qfactory.hpp:15,
                 from /home/me/.apps/qrack/src/qbdthybrid.cpp:13:
In member function ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = std::complex<float>]’,
    inlined from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = std::complex<float>; _Dp = std::default_delete<std::complex<float> >]’ at /usr/include/c++/13.2.1/bits/unique_ptr.h:404:17,
    inlined from ‘void Qrack::QBdtHybrid::SwitchMode(bool)’ at /home/me/.apps/qrack/include/qbdthybrid.hpp:69:5:
/usr/include/c++/13.2.1/bits/unique_ptr.h:99:9: error: ‘void operator delete(void*)’ called on pointer returned from a mismatched allocation function [-Werror=mismatched-new-delete]
   99 |         delete __ptr;
      |         ^~~~~~~~~~~~
In file included from /home/me/.apps/qrack/include/qfactory.hpp:38:
/home/me/.apps/qrack/include/qbdthybrid.hpp: In member function ‘void Qrack::QBdtHybrid::SwitchMode(bool)’:
/home/me/.apps/qrack/include/qbdthybrid.hpp:55:66: note: returned from ‘void* operator new [](std::size_t)’
   55 |         std::unique_ptr<complex> sv(new complex[(size_t)maxQPower]);
      |                                                                  ^
In member function ‘void std::default_delete<_Tp>::operator()(_Tp*) const [with _Tp = std::complex<float>]’,
    inlined from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp = std::complex<float>; _Dp = std::default_delete<std::complex<float> >]’ at /usr/include/c++/13.2.1/bits/unique_ptr.h:404:17,
    inlined from ‘void Qrack::QBdtHybrid::SwitchMode(bool)’ at /home/me/.apps/qrack/include/qbdthybrid.hpp:69:5:
/usr/include/c++/13.2.1/bits/unique_ptr.h:99:9: error: ‘void operator delete(void*)’ called on pointer returned from a mismatched allocation function [-Werror=mismatched-new-delete]
   99 |         delete __ptr;
      |         ^~~~~~~~~~~~
/home/me/.apps/qrack/include/qbdthybrid.hpp: In member function ‘void Qrack::QBdtHybrid::SwitchMode(bool)’:
/home/me/.apps/qrack/include/qbdthybrid.hpp:55:66: note: returned from ‘void* operator new [](std::size_t)’
   55 |         std::unique_ptr<complex> sv(new complex[(size_t)maxQPower]);
      |                                                                  ^

The fix should be quite simple: simply change the above line to (note the added [] in the std::unique_ptr template parameter)

 std::unique_ptr<complex[]> sv(new complex[(size_t)maxQPower]);