libocca / occa

Portable and vendor neutral framework for parallel programming on heterogeneous platforms.
https://libocca.org
MIT License
382 stars 81 forks source link

`occa::memory::setDtype` Modifies other references #747

Open noelchalmers opened 3 months ago

noelchalmers commented 3 months ago

Following the recent change to occa::memory::size() the following program:

#include <occa.hpp>

int main(const int argc, const char **argv) {

  occa::device device({{"mode", "Serial"}});

  size_t Nentries = 10;
  occa::memory a = device.malloc<double>(Nentries);

  printf("Size of a = %ld \n", a.size());

  occa::memory b = a;
  b.setDtype(occa::dtype::char_);

  printf("Size of a = %ld \n", a.size());

  return 0;
}

will print

Size of a = 10
Size of a = 80

I.e., calling occa::memory::setDtype on b modifies the 'size' of a and all other memory handles that wrap the same modeMemory. This is because dtype is held in the modeMemory class, not the memory wrapper.

While this is a bit corner case-y, I think the behavior should be that memory wrappers hold the dtype, not the modeMemory so that the return values of size when performing such type-punning is more intuitive.