static void THTensor_(resize_raw)(THTensor *self, int nDimension, long *size) { int isSame = 0; int d; { int nDimension_ = 0; for(d = 0; d < nDimension; d++) { if(size[d] > 0) nDimension_++; else break; } nDimension = nDimension_; } if(nDimension == self->nDimension) { isSame = 1; for(d = 0; d < self->nDimension; d++) { if(self->size[d] != size[d]) { isSame = 0; break; } } } if(!isSame) { long stride = 1; self->size = THRealloc(self->size, sizeof(long)*nDimension); self->stride = THRealloc(self->stride, sizeof(long)*nDimension); self->nDimension = nDimension; for(d = nDimension-1; d >= 0; d--) { self->size[d] = size[d]; self->stride[d] = stride; stride *= size[d]; } stride += self->storageOffset; if(stride > THStorage_(size)(self->storage)) THStorage_(resize)(self->storage, stride); } }
THCSTensor* THCSTensor_(rawResize)(THCState *state, THCSTensor *self, int nDimI, int nDimV, int64_t *size) { // Only resize valid sizes into tensor. int64_t dims = nDimI + nDimV == 0 ? 1 : nDimI + nDimV; // FIXME: nDimI + nDimV should not be 0. self->size = (int64_t *)THRealloc(self->size, sizeof(int64_t)*(dims)); for (int64_t d = 0; d < dims; d++) { self->size[d] = size[d]; } self->nDimensionI = nDimI; self->nDimensionV = nDimV; return self; }
static void THCudaTensor_rawResize(THCState *state, THCudaTensor *self, int nDimension, long *size, long *stride) { int d; int nDimension_; long totalSize; int hascorrectsize = 1; nDimension_ = 0; for(d = 0; d < nDimension; d++) { if(size[d] > 0) { nDimension_++; if((self->nDimension > d) && (size[d] != self->size[d])) hascorrectsize = 0; if((self->nDimension > d) && stride && (stride[d] >= 0) && (stride[d] != self->stride[d])) hascorrectsize = 0; } else break; } nDimension = nDimension_; if(nDimension != self->nDimension) hascorrectsize = 0; if(hascorrectsize) return; if(nDimension > 0) { if(nDimension != self->nDimension) { self->size = (long*)THRealloc(self->size, sizeof(long)*nDimension); self->stride = (long*)THRealloc(self->stride, sizeof(long)*nDimension); self->nDimension = nDimension; } totalSize = 1; for(d = self->nDimension-1; d >= 0; d--) { self->size[d] = size[d]; if(stride && (stride[d] >= 0) ) self->stride[d] = stride[d]; else { if(d == self->nDimension-1) self->stride[d] = 1; else self->stride[d] = self->size[d+1]*self->stride[d+1]; } totalSize += (self->size[d]-1)*self->stride[d]; } if(totalSize+self->storageOffset > 0) { if(!self->storage) self->storage = THCudaStorage_new(state); if(totalSize+self->storageOffset > self->storage->size) THCudaStorage_resize(state, self->storage, totalSize+self->storageOffset); } } else self->nDimension = 0; }
static void *THDefaultAllocator_realloc(void* ctx, void* ptr, ptrdiff_t size) { return THRealloc(ptr, size); }