TRIQS / nda

C++ library for multi-dimensional arrays
https://triqs.github.io/nda
Other
15 stars 12 forks source link

Error converting array slice to matrix view in Fortran layout #41

Open jasonkaye opened 1 year ago

jasonkaye commented 1 year ago

I often want to take a matrix view of an array A, reshaped to rank 2, for example to contract over one of the indices of A with another matrix using a BLAS gemm. Furthermore, sometimes I want to do this with a slice of the array A, taking care so that reshaping is only done in contiguous memory. I am getting an error when I try to do this with Fortran layout arrays. Here is a minimal working example:

#include "nda/nda.hpp"
using namespace nda;

int main() {

  int m = 3;
  int n = 3;
  int p = 3;

  // This code compiles
  auto a = nda::array<double,3>(m,n,p);
  auto a_reshaped = nda::reshaped_view(a(range(2),range(n),range(p)), std::array<int, 2>({2*n,p}));
  auto a_matrix = matrix_const_view<double>(a_reshaped);

  // This code does not compile
  auto af = nda::array<double,3,F_layout>(m,n,p);
  auto af_reshaped = nda::reshaped_view(a(range(m),range(n),range(2)), std::array<int, 2>({m,n*2}));
  auto af_matrix = matrix_const_view<double,F_layout>(a_reshaped);

}

Note that the code compiles when I use C layout, but not when I use Fortran layout. The error is triggered at the matrix_const_view step, not at the reshaped_view step.

I am using the DEV_CUDA_LINALG branch of nda, hash #189c585fc78651859db279e98df53b1e4ee11a04, on a Linux machine.