Thank you for your answer !
Finally I have:
a = torch.FloatTensor([[1,2,3],[4,5,6]])
b = torch.FloatTensor([[10,20,30],[40,50,60]])
c = torch.stack([a,b], dim=0)
N,F = c.size()

c_1 = c.repeat(1,N).view(N*N, -1)
c_2 = c.repeat(N,1)
c_2f = torch.cat([c_1, c_2], dim=1)
c_2f # Which can also be NxNx2F with view
    1     2     3     1     2     3
    1     2     3     4     5     6
    1     2     3    10    20    30
    1     2     3    40    50    60
    4     5     6     1     2     3
    4     5     6     4     5     6
    4     5     6    10    20    30
    4     5     6    40    50    60
   10    20    30     1     2     3
   10    20    30     4     5     6
   10    20    30    10    20    30
   10    20    30    40    50    60
   40    50    60     1     2     3
   40    50    60     4     5     6
   40    50    60    10    20    30
   40    50    60    40    50    60
[torch.FloatTensor of size 16x6]

Do you think there is a better way to do it in term of memory using another existing function instead of torch.repeat ?