blob: 3d25025d5812e0872a7864acc1a2e546bd4f7aa7 [file] [log] [blame]
#include "THCGeneral.h"
#include "THCTensor.h"
/* specific methods */
void THCudaTensor_copyFloat(THCudaTensor *self, struct THFloatTensor *src)
{
THArgCheck(THCudaTensor_nElement(self) == THFloatTensor_nElement(src), 2, "sizes do not match");
{
THCudaTensor *selfc = THCudaTensor_newContiguous(self);
src = THFloatTensor_newContiguous(src);
THCudaCheck(cudaMemcpy(selfc->storage->data + selfc->storageOffset, src->storage->data + src->storageOffset, THFloatTensor_nElement(src) * sizeof(float), cudaMemcpyHostToDevice));
THFloatTensor_free(src);
THCudaTensor_freeCopyTo(selfc, self);
}
}
/* everything comes down to copy to a tensor of floats */
#define IMPLEMENT_TH_CUDA_TENSOR_COPY(TYPEC) \
void THCudaTensor_copy##TYPEC(THCudaTensor *self, struct TH##TYPEC##Tensor *src) \
{ \
THArgCheck(THCudaTensor_nElement(self) == TH##TYPEC##Tensor_nElement(src), 2, "sizes do not match"); \
\
{ \
THLongStorage *size = TH##TYPEC##Tensor_newSizeOf(src); \
THFloatTensor *srcf = THFloatTensor_newWithSize(size, NULL); \
\
THFloatTensor_copy##TYPEC(srcf, src); \
THCudaTensor_copyFloat(self, srcf); \
\
THLongStorage_free(size); \
THFloatTensor_free(srcf); \
} \
}
IMPLEMENT_TH_CUDA_TENSOR_COPY(Byte)
IMPLEMENT_TH_CUDA_TENSOR_COPY(Char)
IMPLEMENT_TH_CUDA_TENSOR_COPY(Short)
IMPLEMENT_TH_CUDA_TENSOR_COPY(Int)
IMPLEMENT_TH_CUDA_TENSOR_COPY(Long)
IMPLEMENT_TH_CUDA_TENSOR_COPY(Double)
/* copyCuda */
void THFloatTensor_copyCuda(THFloatTensor *self, struct THCudaTensor *src)
{
THArgCheck(THFloatTensor_nElement(self) == THCudaTensor_nElement(src), 2, "sizes do not match");
{
THFloatTensor *selfc = THFloatTensor_newContiguous(self);
src = THCudaTensor_newContiguous(src);
THCudaCheck(cudaMemcpy(selfc->storage->data + selfc->storageOffset, src->storage->data + src->storageOffset, THCudaTensor_nElement(src) * sizeof(float), cudaMemcpyDeviceToHost));
THCudaTensor_free(src);
THFloatTensor_freeCopyTo(selfc, self);
}
}
#define IMPLEMENT_TH_CUDA_TENSOR_COPY_TO(TYPEC) \
void TH##TYPEC##Tensor_copyCuda(TH##TYPEC##Tensor *self, struct THCudaTensor *src) \
{ \
THArgCheck(TH##TYPEC##Tensor_nElement(self) == THCudaTensor_nElement(src), 2, "sizes do not match"); \
\
{ \
THLongStorage *size = THCudaTensor_newSizeOf(src); \
THFloatTensor *srcf = THFloatTensor_newWithSize(size, NULL); \
\
THFloatTensor_copyCuda(srcf, src); \
TH##TYPEC##Tensor_copyFloat(self, srcf); \
\
THLongStorage_free(size); \
THFloatTensor_free(srcf); \
} \
}
IMPLEMENT_TH_CUDA_TENSOR_COPY_TO(Byte)
IMPLEMENT_TH_CUDA_TENSOR_COPY_TO(Char)
IMPLEMENT_TH_CUDA_TENSOR_COPY_TO(Short)
IMPLEMENT_TH_CUDA_TENSOR_COPY_TO(Int)
IMPLEMENT_TH_CUDA_TENSOR_COPY_TO(Long)
IMPLEMENT_TH_CUDA_TENSOR_COPY_TO(Double)
void THCudaTensor_copyCuda(THCudaTensor *self, THCudaTensor *src)
{
THCudaTensor_copy(self, src);
}