1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#ifndef THC_GENERIC_FILE
#define THC_GENERIC_FILE "generic/THCStorageCopy.c"
#else
#ifndef THC_REAL_IS_HALF
void THCStorage_(copyCPU)(THCState *state, THCStorage *self, struct THStorage *src)
{
THArgCheck(self->size == src->size, 2, "size does not match");
THCudaCheck(cudaMemcpy(self->data, src->data, self->size * sizeof(real), cudaMemcpyHostToDevice));
}
#endif
#ifndef THC_REAL_IS_HALF
#define TH_CUDA_STORAGE_IMPLEMENT_COPY(TYPEC) \
void THCStorage_(copy##TYPEC)(THCState *state, THCStorage *self, struct TH##TYPEC##Storage *src) \
{ \
if(THCTypeIdx_(Real) == THCTypeIdx_(TYPEC)) { \
THCStorage_(copyCPU)(state, self, (THStorage*) src); /* cast just removes compiler warning */ \
} else { \
THStorage *buffer; \
THArgCheck(self->size == src->size, 2, "size does not match"); \
buffer = THStorage_(newWithSize)(src->size); \
THStorage_(copy##TYPEC)(buffer, src); \
THCStorage_(copyCPU)(state, self, buffer); \
THStorage_(free)(buffer); \
} \
}
#else
#define TH_CUDA_STORAGE_IMPLEMENT_COPY(TYPEC) \
void THCStorage_(copy##TYPEC)(THCState *state, THCStorage *self, struct TH##TYPEC##Storage *src) \
{ \
THArgCheck(self->size == src->size, 2, "size does not match"); \
THCudaStorage *buffer = THCudaStorage_newWithSize(state, src->size); \
THCudaStorage_copy##TYPEC(state, buffer, src); \
THCFloat2Half(state, self->data, buffer->data, src->size); \
THCudaStorage_free(state, buffer); \
}
#endif
TH_CUDA_STORAGE_IMPLEMENT_COPY(Byte)
TH_CUDA_STORAGE_IMPLEMENT_COPY(Char)
TH_CUDA_STORAGE_IMPLEMENT_COPY(Short)
TH_CUDA_STORAGE_IMPLEMENT_COPY(Int)
TH_CUDA_STORAGE_IMPLEMENT_COPY(Long)
TH_CUDA_STORAGE_IMPLEMENT_COPY(Float)
TH_CUDA_STORAGE_IMPLEMENT_COPY(Double)
#ifndef THC_REAL_IS_HALF
void THStorage_(copyCuda)(THCState *state, THStorage *self, struct THCStorage *src)
{
THArgCheck(self->size == src->size, 2, "size does not match");
THCudaCheck(cudaMemcpy(self->data, src->data, self->size * sizeof(real), cudaMemcpyDeviceToHost));
}
#endif
#ifndef THC_REAL_IS_HALF
#define TH_CUDA_STORAGE_IMPLEMENT_COPYTO(TYPEC) \
void TH_CONCAT_4(TH,TYPEC,Storage_copyCuda,Real)(THCState *state, TH##TYPEC##Storage *self, struct THCStorage *src) \
{ \
if(THCTypeIdx_(Real) == THCTypeIdx_(TYPEC)) { \
THStorage_(copyCuda)(state, (THStorage*) self, src); /* cast just removes compiler warnings */ \
} else { \
THStorage *buffer; \
THArgCheck(self->size == src->size, 2, "size does not match"); \
buffer = THStorage_(newWithSize)(src->size); \
THStorage_(copyCuda)(state, buffer, src); \
TH_CONCAT_4(TH,TYPEC,Storage_copy,Real)(self, buffer); \
THStorage_(free)(buffer); \
} \
}
#else
#define TH_CUDA_STORAGE_IMPLEMENT_COPYTO(TYPEC) \
void TH_CONCAT_4(TH,TYPEC,Storage_copyCuda,Real)(THCState *state, TH##TYPEC##Storage *self, struct THCStorage *src) \
{ \
THArgCheck(self->size == src->size, 2, "size does not match"); \
THCudaStorage *buffer = THCudaStorage_newWithSize(state, src->size);\
THCHalf2Float(state, buffer->data, src->data, src->size); \
TH_CONCAT_3(TH,TYPEC,Storage_copyCudaFloat)(state, self, buffer); \
THCudaStorage_free(state, buffer); \
}
#endif
TH_CUDA_STORAGE_IMPLEMENT_COPYTO(Byte)
TH_CUDA_STORAGE_IMPLEMENT_COPYTO(Char)
TH_CUDA_STORAGE_IMPLEMENT_COPYTO(Short)
TH_CUDA_STORAGE_IMPLEMENT_COPYTO(Int)
TH_CUDA_STORAGE_IMPLEMENT_COPYTO(Long)
TH_CUDA_STORAGE_IMPLEMENT_COPYTO(Float)
TH_CUDA_STORAGE_IMPLEMENT_COPYTO(Double)
#undef TH_CUDA_STORAGE_IMPLEMENT_COPY
#undef TH_CUDA_STORAGE_IMPLEMENT_COPYTO
#endif
|