#ifndef THC_GENERIC_FILE #define THC_GENERIC_FILE "generic/THCDeviceTensorUtils.cu" #else /// Constructs a THCDeviceTensor initialized from a THCudaTensor. Will /// error if the dimensionality does not match exactly. template class PtrTraits> THCDeviceTensor toDeviceTensor(THCState* state, THCTensor* t); template THCDeviceTensor toDeviceTensor(THCState* state, THCTensor* t) { return toDeviceTensor(state, t); } template THCDeviceTensor toDeviceTensor(THCState* state, THCTensor* t) { return toDeviceTensor(state, t); } template class PtrTraits> THCDeviceTensor toDeviceTensor(THCState* state, THCTensor* t) { if (Dim != THCTensor_(nDimension)(state, t)) { THError("THCudaTensor dimension mismatch"); } // Determine the maximum offset into the tensor achievable; `IndexT` // must be smaller than this type in order to use it. ptrdiff_t maxOffset = 0; IndexT sizes[Dim]; IndexT strides[Dim]; for (int i = 0; i < Dim; ++i) { int64_t size = THCTensor_(size)(state, t, i); int64_t stride = THCTensor_(stride)(state, t, i); maxOffset += (size - 1) * stride; sizes[i] = (IndexT) size; strides[i] = (IndexT) stride; } if (maxOffset > std::numeric_limits::max()) { THError("THCudaTensor sizes too large for THCDeviceTensor conversion"); } return THCDeviceTensor( THCTensor_(data)(state, t), sizes, strides); } #endif