Hi,
nn.GPU is just a convenient way to run a module on a given GPU. It does not do any multiprocessing.
It is doing (more complex to handle non-Tensor inputs):
def forward(self, input):
    gpu_input = input.cuda(self.gpuid)
    with torch.cuda.device(self.gpuid):
        out = self.mod(gpu_input)
    output = out.cuda(self.out_device)
    return output

What the lua code is doing is actually building a DataParallel by hand I think. So yes you should be using that.