mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-20 21:14:14 +08:00
Change comparison ops result dtype to bool [Part1] (#20767)
Summary: This is the first part of the planned changes to change the comparison operations result tensor dtype from Byte to Bool. You can see the whole list of changes (not cleaned up) [here](https://github.com/pytorch/pytorch/pull/19332). As the PR is too big for a single review im breaking it into pieces. **Changes in this PR:** 1. Enable these methods for bool tensors: - maskedSelect - maskedSelectBool - bitand - cbitand - bitor - cbitor - bitxor - cbitxor - sign - equal - neg 2. Add bool clause for the TH version of sign method. Pull Request resolved: https://github.com/pytorch/pytorch/pull/20767 Differential Revision: D15436446 Pulled By: izdeby fbshipit-source-id: 8d2494b5f4873cd79c7f1a40d2cb045cadfad51a
This commit is contained in:
committed by
Facebook Github Bot
parent
6ec3c12255
commit
12bc81ae2a
@ -92,11 +92,13 @@
|
||||
options:
|
||||
- arguments:
|
||||
- arg: THTensor* self
|
||||
broadcast: mask inplace fallback types:Bool
|
||||
- THBoolTensor* mask
|
||||
- real value
|
||||
- zero_dim_tensor_only: True
|
||||
arguments:
|
||||
- arg: THTensor* self
|
||||
broadcast: mask inplace fallback types:Bool
|
||||
- THBoolTensor* mask
|
||||
- THTensor* value
|
||||
]]
|
||||
@ -118,12 +120,15 @@
|
||||
return: self
|
||||
arguments:
|
||||
- arg: THTensor* self
|
||||
broadcast: mask inplace fallback types:Bool
|
||||
- THBoolTensor* mask
|
||||
- THTensor* source
|
||||
]]
|
||||
[[
|
||||
name: _th_masked_select
|
||||
cname: maskedSelect
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
variants:
|
||||
- function
|
||||
return: argument 0
|
||||
@ -137,6 +142,8 @@
|
||||
[[
|
||||
name: _th_masked_select_bool
|
||||
cname: maskedSelectBool
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
variants:
|
||||
- function
|
||||
return: argument 0
|
||||
@ -144,6 +151,7 @@
|
||||
- arg: THTensor* result
|
||||
output: True
|
||||
- arg: THTensor* self
|
||||
broadcast: mask fallback types:Bool
|
||||
- THBoolTensor* mask
|
||||
]]
|
||||
[[
|
||||
@ -366,6 +374,8 @@
|
||||
]]
|
||||
[[
|
||||
name: _th_and
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
cname: __and__
|
||||
variants:
|
||||
- function
|
||||
@ -388,6 +398,8 @@
|
||||
[[
|
||||
name: _th_iand_
|
||||
cname: __iand__
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
variants:
|
||||
- function
|
||||
return: argument 0
|
||||
@ -407,6 +419,8 @@
|
||||
[[
|
||||
name: _th_or
|
||||
cname: __or__
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
variants:
|
||||
- function
|
||||
return: argument 0
|
||||
@ -428,6 +442,8 @@
|
||||
[[
|
||||
name: _th_ior_
|
||||
cname: __ior__
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
variants:
|
||||
- function
|
||||
return: argument 0
|
||||
@ -447,6 +463,8 @@
|
||||
[[
|
||||
name: _th_xor
|
||||
cname: __xor__
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
variants:
|
||||
- function
|
||||
return: argument 0
|
||||
@ -1772,6 +1790,8 @@
|
||||
[[
|
||||
name: _th_sign
|
||||
cname: sign
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
variants:
|
||||
- function
|
||||
return: argument 0
|
||||
|
@ -405,10 +405,10 @@ Tensor & masked_select_out(Tensor & result, const Tensor & self, const Tensor &
|
||||
|
||||
Tensor masked_select(const Tensor & self, const Tensor & mask) {
|
||||
if (mask.dtype() == at::ScalarType::Byte) {
|
||||
return at::legacy::th::_th_masked_select(self, mask);
|
||||
} else {
|
||||
return at::legacy::th::_th_masked_select_bool(self, mask);
|
||||
}
|
||||
return at::legacy::th::_th_masked_select(self, mask);
|
||||
} else {
|
||||
return at::legacy::th::_th_masked_select_bool(self, mask);
|
||||
}
|
||||
}
|
||||
|
||||
Tensor & nonzero_out(Tensor & result, const Tensor & self) {
|
||||
|
@ -1390,7 +1390,7 @@
|
||||
|
||||
- func: poisson_nll_loss(Tensor input, Tensor target, bool log_input, bool full, float eps, int reduction) -> Tensor
|
||||
variants: function
|
||||
|
||||
|
||||
- func: scalar_tensor(Scalar s, *, ScalarType? dtype=None, Layout? layout=None, Device? device=None, bool? pin_memory=None) -> Tensor
|
||||
|
||||
- func: rand(int[] size, *, ScalarType? dtype=None, Layout? layout=None, Device? device=None, bool? pin_memory=None) -> Tensor
|
||||
@ -1485,6 +1485,8 @@
|
||||
CUDA: _neg__cuda
|
||||
|
||||
- func: neg(Tensor self, *, Tensor(a!) out) -> Tensor(a!)
|
||||
cpu_bool: True
|
||||
cuda_bool: True
|
||||
dispatch:
|
||||
CPU: _neg_out_cpu
|
||||
CUDA: _neg_out_cuda
|
||||
|
@ -78,6 +78,76 @@ accreal THTensor_(sumall)(THTensor *tensor)
|
||||
scalar_t, tensor, *tensor_data, sum, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
return sum;
|
||||
}
|
||||
|
||||
void THTensor_(maskedSelect)(THTensor *tensor, THTensor *src, THByteTensor *mask)
|
||||
{
|
||||
ptrdiff_t numel = THByteTensor_sumall(mask);
|
||||
scalar_t *tensor_data;
|
||||
|
||||
#ifdef DEBUG
|
||||
THAssert(numel <= LONG_MAX);
|
||||
#endif
|
||||
THTensor_(resize1d)(tensor,numel);
|
||||
tensor_data = tensor->data<scalar_t>();
|
||||
TH_TENSOR_APPLY2(scalar_t, src, unsigned char, mask,
|
||||
if (*mask_data > 1)
|
||||
{
|
||||
THFree(mask_counter);
|
||||
THFree(src_counter);
|
||||
THError("Mask tensor can take 0 and 1 values only");
|
||||
}
|
||||
else if (*mask_data == 1)
|
||||
{
|
||||
*tensor_data = *src_data;
|
||||
tensor_data++;
|
||||
});
|
||||
}
|
||||
|
||||
void THTensor_(maskedSelectBool)(THTensor *tensor, THTensor *src, THBoolTensor *mask)
|
||||
{
|
||||
ptrdiff_t numel = THBoolTensor_sumall(mask);
|
||||
scalar_t *tensor_data;
|
||||
|
||||
#ifdef DEBUG
|
||||
THAssert(numel <= LONG_MAX);
|
||||
#endif
|
||||
THTensor_(resize1d)(tensor,numel);
|
||||
tensor_data = tensor->data<scalar_t>();
|
||||
TH_TENSOR_APPLY2(scalar_t, src, bool, mask,
|
||||
if (*mask_data)
|
||||
{
|
||||
*tensor_data = *src_data;
|
||||
tensor_data++;
|
||||
});
|
||||
}
|
||||
|
||||
void THTensor_(bitand)(THTensor *r_, THTensor *t, scalar_t value)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)value;
|
||||
return THError("bitand is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
if (r_Contig && tContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD * 100,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] & value;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY2_PARALLEL(r_Size, r_Contig, tContig, scalar_t, r_, scalar_t, t, *r__data = *t_data & value;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(TH_REAL_IS_BOOL)
|
||||
|
||||
void THTensor_(maskedFill)(THTensor *tensor, THByteTensor *mask, scalar_t value)
|
||||
@ -189,48 +259,6 @@ void THTensor_(maskedCopyBool)(THTensor *tensor, THBoolTensor *mask, THTensor* s
|
||||
c10::raw::intrusive_ptr::decref(srct);
|
||||
}
|
||||
|
||||
void THTensor_(maskedSelect)(THTensor *tensor, THTensor *src, THByteTensor *mask)
|
||||
{
|
||||
ptrdiff_t numel = THByteTensor_sumall(mask);
|
||||
scalar_t *tensor_data;
|
||||
|
||||
#ifdef DEBUG
|
||||
THAssert(numel <= LONG_MAX);
|
||||
#endif
|
||||
THTensor_(resize1d)(tensor,numel);
|
||||
tensor_data = tensor->data<scalar_t>();
|
||||
TH_TENSOR_APPLY2(scalar_t, src, unsigned char, mask,
|
||||
if (*mask_data > 1)
|
||||
{
|
||||
THFree(mask_counter);
|
||||
THFree(src_counter);
|
||||
THError("Mask tensor can take 0 and 1 values only");
|
||||
}
|
||||
else if (*mask_data == 1)
|
||||
{
|
||||
*tensor_data = *src_data;
|
||||
tensor_data++;
|
||||
});
|
||||
}
|
||||
|
||||
void THTensor_(maskedSelectBool)(THTensor *tensor, THTensor *src, THBoolTensor *mask)
|
||||
{
|
||||
ptrdiff_t numel = THBoolTensor_sumall(mask);
|
||||
scalar_t *tensor_data;
|
||||
|
||||
#ifdef DEBUG
|
||||
THAssert(numel <= LONG_MAX);
|
||||
#endif
|
||||
THTensor_(resize1d)(tensor,numel);
|
||||
tensor_data = tensor->data<scalar_t>();
|
||||
TH_TENSOR_APPLY2(scalar_t, src, bool, mask,
|
||||
if (*mask_data)
|
||||
{
|
||||
*tensor_data = *src_data;
|
||||
tensor_data++;
|
||||
});
|
||||
}
|
||||
|
||||
void THTensor_(indexSelect)(THTensor *tensor, THTensor *src, int dim, THLongTensor *index)
|
||||
{
|
||||
ptrdiff_t i, numel;
|
||||
@ -880,33 +908,6 @@ void THTensor_(remainder)(THTensor *r_, THTensor *t, scalar_t value)
|
||||
}
|
||||
}
|
||||
|
||||
void THTensor_(bitand)(THTensor *r_, THTensor *t, scalar_t value)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)value;
|
||||
return THError("bitand is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
if (r_Contig && tContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD * 100,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] & value;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY2_PARALLEL(r_Size, r_Contig, tContig, scalar_t, r_, scalar_t, t, *r__data = *t_data & value;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -21,36 +21,104 @@
|
||||
// sense (rather than just having cut the file down the middle, which is
|
||||
// what I did when I split these up originally).
|
||||
|
||||
#if !defined(TH_REAL_IS_BOOL) /* non bool only part */
|
||||
|
||||
// Should wrap if the value (a) has a different sign than the divisor (b), but is not 0.
|
||||
static inline bool modulo_wrap(scalar_t a, scalar_t b) {
|
||||
return (a != 0) && (a < 0) != (b < 0);
|
||||
}
|
||||
|
||||
void THTensor_(bitor)(THTensor *r_, THTensor *t, scalar_t value)
|
||||
void THTensor_(cbitand)(THTensor *r_, THTensor *t, THTensor *src)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)value;
|
||||
return THError("bitor is only supported for integer type tensors");
|
||||
(void)src;
|
||||
return THError("cbitand is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int64_t srcSize = THTensor_(nElement)(src);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
if (r_Contig && tContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD * 100,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] | value;
|
||||
}
|
||||
});
|
||||
int srcContig = THTensor_(isContiguous)(src);
|
||||
if (srcSize == r_Size){
|
||||
if (r_Contig && tContig && srcContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *sp = src->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] & sp[i];
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY3_PARALLEL(r_Size, r_Contig, tContig, srcContig, scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data & *src_data;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
} else {
|
||||
TH_TENSOR_APPLY2_PARALLEL(r_Size, r_Contig, tContig, scalar_t, r_, scalar_t, t, *r__data = *t_data | value;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
TH_TENSOR_APPLY3(scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data & *src_data;);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void THTensor_(cbitor)(THTensor *r_, THTensor *t, THTensor *src)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)src;
|
||||
return THError("cbitor is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int64_t srcSize = THTensor_(nElement)(src);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
int srcContig = THTensor_(isContiguous)(src);
|
||||
if (srcSize == r_Size){
|
||||
if (r_Contig && tContig && srcContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *sp = src->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] | sp[i];
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY3_PARALLEL(r_Size, r_Contig, tContig, srcContig, scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data | *src_data;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
} else {
|
||||
TH_TENSOR_APPLY3(scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data | *src_data;);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void THTensor_(cbitxor)(THTensor *r_, THTensor *t, THTensor *src)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)src;
|
||||
return THError("cbitxor is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int64_t srcSize = THTensor_(nElement)(src);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
int srcContig = THTensor_(isContiguous)(src);
|
||||
if (srcSize == r_Size){
|
||||
if (r_Contig && tContig && srcContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *sp = src->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] ^ sp[i];
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY3_PARALLEL(r_Size, r_Contig, tContig, srcContig, scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data ^ *src_data;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
} else {
|
||||
TH_TENSOR_APPLY3(scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data ^ *src_data;);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -82,6 +150,40 @@ void THTensor_(bitxor)(THTensor *r_, THTensor *t, scalar_t value)
|
||||
#endif
|
||||
}
|
||||
|
||||
void THTensor_(bitor)(THTensor *r_, THTensor *t, scalar_t value)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)value;
|
||||
return THError("bitor is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
if (r_Contig && tContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD * 100,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] | value;
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY2_PARALLEL(r_Size, r_Contig, tContig, scalar_t, r_, scalar_t, t, *r__data = *t_data | value;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(TH_REAL_IS_BOOL) /* non bool only part */
|
||||
|
||||
// Should wrap if the value (a) has a different sign than the divisor (b), but is not 0.
|
||||
static inline bool modulo_wrap(scalar_t a, scalar_t b) {
|
||||
return (a != 0) && (a < 0) != (b < 0);
|
||||
}
|
||||
|
||||
void THTensor_(clamp)(THTensor *r_, THTensor *t, scalar_t min_value, scalar_t max_value)
|
||||
{
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
@ -453,108 +555,6 @@ void THTensor_(cremainder)(THTensor *r_, THTensor *t, THTensor *src)
|
||||
}
|
||||
}
|
||||
|
||||
void THTensor_(cbitand)(THTensor *r_, THTensor *t, THTensor *src)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)src;
|
||||
return THError("cbitand is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int64_t srcSize = THTensor_(nElement)(src);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
int srcContig = THTensor_(isContiguous)(src);
|
||||
if (srcSize == r_Size){
|
||||
if (r_Contig && tContig && srcContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *sp = src->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] & sp[i];
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY3_PARALLEL(r_Size, r_Contig, tContig, srcContig, scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data & *src_data;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
} else {
|
||||
TH_TENSOR_APPLY3(scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data & *src_data;);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void THTensor_(cbitor)(THTensor *r_, THTensor *t, THTensor *src)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)src;
|
||||
return THError("cbitor is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int64_t srcSize = THTensor_(nElement)(src);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
int srcContig = THTensor_(isContiguous)(src);
|
||||
if (srcSize == r_Size){
|
||||
if (r_Contig && tContig && srcContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *sp = src->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] | sp[i];
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY3_PARALLEL(r_Size, r_Contig, tContig, srcContig, scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data | *src_data;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
} else {
|
||||
TH_TENSOR_APPLY3(scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data | *src_data;);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void THTensor_(cbitxor)(THTensor *r_, THTensor *t, THTensor *src)
|
||||
{
|
||||
#if defined(TH_REAL_IS_FLOAT) || defined(TH_REAL_IS_DOUBLE) || defined(TH_REAL_IS_HALF)
|
||||
(void)r_;
|
||||
(void)t;
|
||||
(void)src;
|
||||
return THError("cbitxor is only supported for integer type tensors");
|
||||
#else
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
int64_t r_Size = THTensor_(nElement)(r_);
|
||||
int64_t srcSize = THTensor_(nElement)(src);
|
||||
int r_Contig = THTensor_(isContiguous)(r_);
|
||||
int tContig = THTensor_(isContiguous)(t);
|
||||
int srcContig = THTensor_(isContiguous)(src);
|
||||
if (srcSize == r_Size){
|
||||
if (r_Contig && tContig && srcContig) {
|
||||
scalar_t *tp = t->data<scalar_t>();
|
||||
scalar_t *sp = src->data<scalar_t>();
|
||||
scalar_t *rp = r_->data<scalar_t>();
|
||||
at::parallel_for(0, r_Size, TH_OMP_OVERHEAD_THRESHOLD,
|
||||
[&](int64_t start, int64_t end) {
|
||||
for (auto i = start; i < end; i++) {
|
||||
rp[i] = tp[i] ^ sp[i];
|
||||
}
|
||||
});
|
||||
} else {
|
||||
TH_TENSOR_APPLY3_PARALLEL(r_Size, r_Contig, tContig, srcContig, scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data ^ *src_data;, UNCERTAIN_TH_OMP_OVERHEAD_THRESHOLD);
|
||||
}
|
||||
} else {
|
||||
TH_TENSOR_APPLY3(scalar_t, r_, scalar_t, t, scalar_t, src, *r__data = *t_data ^ *src_data;);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void THTensor_(tpow)(THTensor *r_, scalar_t value, THTensor *t)
|
||||
{
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
|
@ -37,14 +37,24 @@ TH_API void THTensor_(eqTensorT)(THTensor *r_, THTensor *ta, THTensor *tb);
|
||||
TH_API accreal THTensor_(sumall)(THTensor *t);
|
||||
TH_API int THTensor_(equal)(THTensor *ta, THTensor *tb);
|
||||
|
||||
TH_API void THTensor_(maskedSelect)(THTensor *tensor, THTensor* src, THByteTensor *mask);
|
||||
TH_API void THTensor_(maskedSelectBool)(THTensor *tensor, THTensor* src, THBoolTensor *mask);
|
||||
|
||||
TH_API void THTensor_(bitand)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
TH_API void THTensor_(cbitand)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
TH_API void THTensor_(bitor)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
TH_API void THTensor_(cbitor)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
TH_API void THTensor_(bitxor)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
TH_API void THTensor_(cbitxor)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
|
||||
TH_API void THTensor_(sign)(THTensor *r_, THTensor *t);
|
||||
|
||||
#if !defined(TH_REAL_IS_BOOL) /* non bool only part */
|
||||
|
||||
TH_API void THTensor_(maskedFill)(THTensor *tensor, THByteTensor *mask, scalar_t value);
|
||||
TH_API void THTensor_(maskedCopy)(THTensor *tensor, THByteTensor *mask, THTensor* src);
|
||||
TH_API void THTensor_(maskedSelect)(THTensor *tensor, THTensor* src, THByteTensor *mask);
|
||||
TH_API void THTensor_(maskedFillBool)(THTensor *tensor, THBoolTensor *mask, scalar_t value);
|
||||
TH_API void THTensor_(maskedCopyBool)(THTensor *tensor, THBoolTensor *mask, THTensor* src);
|
||||
TH_API void THTensor_(maskedSelectBool)(THTensor *tensor, THTensor* src, THBoolTensor *mask);
|
||||
|
||||
TH_API void THTensor_(indexSelect)(THTensor *tensor, THTensor *src, int dim, THLongTensor *index);
|
||||
TH_API void THTensor_(indexCopy)(THTensor *tensor, int dim, THLongTensor *index, THTensor *src);
|
||||
@ -77,9 +87,6 @@ TH_API void THTensor_(rshift)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
TH_API void THTensor_(fmod)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
TH_API void THTensor_(remainder)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
TH_API void THTensor_(clamp)(THTensor *r_, THTensor *t, scalar_t min_value, scalar_t max_value);
|
||||
TH_API void THTensor_(bitand)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
TH_API void THTensor_(bitor)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
TH_API void THTensor_(bitxor)(THTensor *r_, THTensor *t, scalar_t value);
|
||||
|
||||
TH_API void THTensor_(cadd)(THTensor *r_, THTensor *t, scalar_t value, THTensor *src);
|
||||
TH_API void THTensor_(csub)(THTensor *self, THTensor *src1, scalar_t value, THTensor *src2);
|
||||
@ -90,9 +97,6 @@ TH_API void THTensor_(clshift)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
TH_API void THTensor_(crshift)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
TH_API void THTensor_(cfmod)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
TH_API void THTensor_(cremainder)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
TH_API void THTensor_(cbitand)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
TH_API void THTensor_(cbitor)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
TH_API void THTensor_(cbitxor)(THTensor *r_, THTensor *t, THTensor *src);
|
||||
|
||||
TH_API void THTensor_(addcmul)(THTensor *r_, THTensor *t, scalar_t value, THTensor *src1, THTensor *src2);
|
||||
TH_API void THTensor_(addcdiv)(THTensor *r_, THTensor *t, scalar_t value, THTensor *src1, THTensor *src2);
|
||||
@ -115,7 +119,6 @@ TH_API void THTensor_(mode)(THTensor *values_, THLongTensor *indices_, THTensor
|
||||
TH_API void THTensor_(prod)(THTensor *r_, THTensor *t, int dimension, int keepdim);
|
||||
TH_API void THTensor_(cumsum)(THTensor *r_, THTensor *t, int dimension);
|
||||
TH_API void THTensor_(cumprod)(THTensor *r_, THTensor *t, int dimension);
|
||||
TH_API void THTensor_(sign)(THTensor *r_, THTensor *t);
|
||||
TH_API accreal THTensor_(trace)(THTensor *t);
|
||||
|
||||
TH_API void THTensor_(cmax)(THTensor *r, THTensor *t, THTensor *src);
|
||||
|
@ -63,6 +63,26 @@ int THTensor_(equal)(THTensor *ta, THTensor* tb)
|
||||
return equal;
|
||||
}
|
||||
|
||||
void THTensor_(sign)(THTensor *r_, THTensor *t)
|
||||
{
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
|
||||
#if defined (TH_REAL_IS_BYTE)
|
||||
TH_TENSOR_APPLY2(scalar_t, r_, scalar_t, t,
|
||||
if (*t_data > 0) *r__data = 1;
|
||||
else *r__data = 0;);
|
||||
#elif defined (TH_REAL_IS_BOOL)
|
||||
TH_TENSOR_APPLY2(scalar_t, r_, scalar_t, t,
|
||||
if (*t_data == true) *r__data = false;
|
||||
else *r__data = true;);
|
||||
#else
|
||||
TH_TENSOR_APPLY2(scalar_t, r_, scalar_t, t,
|
||||
if (*t_data > 0) *r__data = 1;
|
||||
else if (*t_data < 0) *r__data = -1;
|
||||
else *r__data = 0;);
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(TH_REAL_IS_BOOL) /* non bool only part */
|
||||
|
||||
void THTensor_(baddbmm)(THTensor *result, scalar_t beta, THTensor *t, scalar_t alpha, THTensor *batch1, THTensor *batch2)
|
||||
@ -400,24 +420,6 @@ void THTensor_(cumprod)(THTensor *r_, THTensor *t, int dimension)
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void THTensor_(sign)(THTensor *r_, THTensor *t)
|
||||
{
|
||||
THTensor_(resizeAs)(r_, t);
|
||||
|
||||
#if defined (TH_REAL_IS_BYTE)
|
||||
TH_TENSOR_APPLY2(scalar_t, r_, scalar_t, t,
|
||||
if (*t_data > 0) *r__data = 1;
|
||||
else *r__data = 0;);
|
||||
#else
|
||||
TH_TENSOR_APPLY2(scalar_t, r_, scalar_t, t,
|
||||
if (*t_data > 0) *r__data = 1;
|
||||
else if (*t_data < 0) *r__data = -1;
|
||||
else *r__data = 0;);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
accreal THTensor_(trace)(THTensor *t)
|
||||
{
|
||||
scalar_t *t_data = t->data<scalar_t>();
|
||||
|
@ -18,7 +18,7 @@ foreach(THC_TYPE Byte Char Short Int Long Half Float Double)
|
||||
endforeach()
|
||||
endforeach()
|
||||
|
||||
foreach(THC_FILE TensorMathCompareT TensorMathCompare TensorMathReduce TensorMasked)
|
||||
foreach(THC_FILE TensorMathCompareT TensorMathCompare TensorMathReduce TensorMasked TensorMathPointwise)
|
||||
if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/generated/THC${THC_FILE}Bool.cu")
|
||||
FILE(WRITE "${CMAKE_CURRENT_SOURCE_DIR}/generated/THC${THC_FILE}Bool.cu"
|
||||
"#include <THC/THC${THC_FILE}.cuh>\n#include <THC/THCTensor.hpp>\n\n#include <THC/generic/THC${THC_FILE}.cu>\n#include <THC/THCGenerateBoolType.h>\n")
|
||||
|
@ -19,9 +19,15 @@
|
||||
#include <THC/generic/THCTensorMathPairwise.h>
|
||||
#include <THC/THCGenerateAllTypes.h>
|
||||
|
||||
#include <THC/generic/THCTensorMathPairwise.h>
|
||||
#include <THC/THCGenerateBoolType.h>
|
||||
|
||||
#include <THC/generic/THCTensorMathPointwise.h>
|
||||
#include <THC/THCGenerateAllTypes.h>
|
||||
|
||||
#include <THC/generic/THCTensorMathPointwise.h>
|
||||
#include <THC/THCGenerateBoolType.h>
|
||||
|
||||
#include <THC/generic/THCTensorMathReduce.h>
|
||||
#include <THC/THCGenerateAllTypes.h>
|
||||
|
||||
@ -46,6 +52,9 @@
|
||||
#include <THC/generic/THCTensorMasked.h>
|
||||
#include <THC/THCGenerateAllTypes.h>
|
||||
|
||||
#include <THC/generic/THCTensorMasked.h>
|
||||
#include <THC/THCGenerateBoolType.h>
|
||||
|
||||
#include <THC/generic/THCTensorScatterGather.h>
|
||||
#include <THC/THCGenerateAllTypes.h>
|
||||
|
||||
|
@ -303,3 +303,6 @@ struct TensorBitXorConstantOp {
|
||||
|
||||
#include <THC/generic/THCTensorMathPairwise.cu>
|
||||
#include <THC/THCGenerateAllTypes.h>
|
||||
|
||||
#include <THC/generic/THCTensorMathPairwise.cu>
|
||||
#include <THC/THCGenerateBoolType.h>
|
||||
|
5
aten/src/THC/generated/THCTensorMathPointwiseBool.cu
Normal file
5
aten/src/THC/generated/THCTensorMathPointwiseBool.cu
Normal file
@ -0,0 +1,5 @@
|
||||
#include <THC/THCTensorMathPointwise.cuh>
|
||||
#include <THC/THCTensor.hpp>
|
||||
|
||||
#include <THC/generic/THCTensorMathPointwise.cu>
|
||||
#include <THC/THCGenerateBoolType.h>
|
@ -2,6 +2,95 @@
|
||||
#define THC_GENERIC_FILE "THC/generic/THCTensorMathPairwise.cu"
|
||||
#else
|
||||
|
||||
int THCTensor_(equal)(THCState *state, THCTensor *self_, THCTensor *src_)
|
||||
{
|
||||
THCAssertSameGPU(THCTensor_(checkGPU)(state, 2, self_, src_));
|
||||
if (!THCTensor_(isSameSizeAs(state, self_, src_))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// This is not as efficient as TH, but the basic idea: create a buffer that stores
|
||||
// 1 if the two tensors are equal at a position, otherwise 0. If the minimum value
|
||||
// in this buffer is 1, the two tensors are equal, otherwise they are not
|
||||
|
||||
THCudaByteTensor *buf = THCudaByteTensor_newWithSize(state, self_->sizes(), {});
|
||||
|
||||
if (!THC_pointwiseApply3<uint8_t, scalar_t, scalar_t>(state, buf, self_, src_, TensorEQOp<scalar_t, unsigned char>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
|
||||
unsigned char min = THCudaByteTensor_minall(state, buf);
|
||||
|
||||
THCudaByteTensor_free(state, buf);
|
||||
|
||||
return min != 0;
|
||||
}
|
||||
|
||||
void THCTensor_(bitand)(THCState* state, THCTensor *self_, THCTensor *src_, scalar_t value)
|
||||
{
|
||||
#if defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE) || defined(THC_REAL_IS_HALF)
|
||||
return THError("bitand only supported for integer type tensors");
|
||||
#else
|
||||
if (self_ == src_) {
|
||||
if (!THC_pointwiseApply1<scalar_t>(state, self_, TensorBitAndConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src_);
|
||||
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src_, TensorBitAndConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(bitor)(THCState* state, THCTensor *self_, THCTensor *src_, scalar_t value)
|
||||
{
|
||||
#if defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE) || defined(THC_REAL_IS_HALF)
|
||||
return THError("bitor only supported for integer type tensors");
|
||||
#else
|
||||
if (self_ == src_) {
|
||||
if (!THC_pointwiseApply1<scalar_t>(state, self_, TensorBitOrConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src_);
|
||||
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src_, TensorBitOrConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(bitxor)(THCState* state, THCTensor *self_, THCTensor *src_, scalar_t value)
|
||||
{
|
||||
#if defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE) || defined(THC_REAL_IS_HALF)
|
||||
return THError("bitxor only supported for integer type tensors");
|
||||
#else
|
||||
if (self_ == src_) {
|
||||
if (!THC_pointwiseApply1<scalar_t>(state, self_, TensorBitXorConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src_);
|
||||
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src_, TensorBitXorConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
#if !defined(THC_REAL_IS_BOOL)
|
||||
|
||||
void THCTensor_(add)(THCState *state, THCTensor *self_, THCTensor *src_, scalar_t value)
|
||||
{
|
||||
THCAssertSameGPU(THCTensor_(checkGPU)(state, 2, self_, src_));
|
||||
@ -196,91 +285,6 @@ void THCTensor_(triu)(THCState *state, THCTensor *self_, THCTensor *src_, int64_
|
||||
THCudaCheck(cudaGetLastError());
|
||||
}
|
||||
|
||||
int THCTensor_(equal)(THCState *state, THCTensor *self_, THCTensor *src_)
|
||||
{
|
||||
THCAssertSameGPU(THCTensor_(checkGPU)(state, 2, self_, src_));
|
||||
if (!THCTensor_(isSameSizeAs(state, self_, src_))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// This is not as efficient as TH, but the basic idea: create a buffer that stores
|
||||
// 1 if the two tensors are equal at a position, otherwise 0. If the minimum value
|
||||
// in this buffer is 1, the two tensors are equal, otherwise they are not
|
||||
|
||||
THCudaByteTensor *buf = THCudaByteTensor_newWithSize(state, self_->sizes(), {});
|
||||
|
||||
if (!THC_pointwiseApply3<uint8_t, scalar_t, scalar_t>(state, buf, self_, src_, TensorEQOp<scalar_t, unsigned char>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
|
||||
unsigned char min = THCudaByteTensor_minall(state, buf);
|
||||
|
||||
THCudaByteTensor_free(state, buf);
|
||||
|
||||
return min != 0;
|
||||
}
|
||||
|
||||
void THCTensor_(bitand)(THCState* state, THCTensor *self_, THCTensor *src_, scalar_t value)
|
||||
{
|
||||
#if defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE) || defined(THC_REAL_IS_HALF)
|
||||
return THError("bitand only supported for integer type tensors");
|
||||
#else
|
||||
if (self_ == src_) {
|
||||
if (!THC_pointwiseApply1<scalar_t>(state, self_, TensorBitAndConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src_);
|
||||
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src_, TensorBitAndConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(bitor)(THCState* state, THCTensor *self_, THCTensor *src_, scalar_t value)
|
||||
{
|
||||
#if defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE) || defined(THC_REAL_IS_HALF)
|
||||
return THError("bitor only supported for integer type tensors");
|
||||
#else
|
||||
if (self_ == src_) {
|
||||
if (!THC_pointwiseApply1<scalar_t>(state, self_, TensorBitOrConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src_);
|
||||
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src_, TensorBitOrConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(bitxor)(THCState* state, THCTensor *self_, THCTensor *src_, scalar_t value)
|
||||
{
|
||||
#if defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE) || defined(THC_REAL_IS_HALF)
|
||||
return THError("bitxor only supported for integer type tensors");
|
||||
#else
|
||||
if (self_ == src_) {
|
||||
if (!THC_pointwiseApply1<scalar_t>(state, self_, TensorBitXorConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src_);
|
||||
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src_, TensorBitXorConstantOp<scalar_t>(value))) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -2,6 +2,14 @@
|
||||
#define THC_GENERIC_FILE "THC/generic/THCTensorMathPairwise.h"
|
||||
#else
|
||||
|
||||
THC_API int THCTensor_(equal)(THCState *state, THCTensor *self, THCTensor *src);
|
||||
|
||||
THC_API void THCTensor_(bitand)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(bitor)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(bitxor)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
|
||||
#if !defined(THC_REAL_IS_BOOL)
|
||||
|
||||
THC_API void THCTensor_(add)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(sub)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(add_scaled)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value, scalar_t alpha);
|
||||
@ -12,10 +20,7 @@ THC_API void THCTensor_(lshift)(THCState *state, THCTensor *self, THCTensor *src
|
||||
THC_API void THCTensor_(rshift)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(fmod)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(remainder)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(bitand)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(bitor)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(bitxor)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
|
||||
THC_API int THCTensor_(equal)(THCState *state, THCTensor *self, THCTensor *src);
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -4,6 +4,106 @@
|
||||
|
||||
#include <ATen/MemoryOverlap.h>
|
||||
|
||||
void THCTensor_(cbitand)(THCState* state, THCTensor *self_, THCTensor *src1, THCTensor *src2)
|
||||
{
|
||||
#if defined(THC_REAL_IS_HALF) || defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE)
|
||||
return THError("cbitand is only supported for integer type tensors");
|
||||
#else
|
||||
THAssert(THCTensor_(checkGPU)(state, 3, self_, src1, src2));
|
||||
THArgCheck(THCTensor_(nElement)(state, src1) ==
|
||||
THCTensor_(nElement)(state, src2), 3, "sizes do not match");
|
||||
|
||||
if (self_ == src1) {
|
||||
// self /= src2
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src2, TensorBitAndOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src1);
|
||||
|
||||
// self = src1 / src2
|
||||
if (!THC_pointwiseApply3<scalar_t, scalar_t, scalar_t>(state, self_, src1, src2, TensorBitAndOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(cbitor)(THCState* state, THCTensor *self_, THCTensor *src1, THCTensor *src2)
|
||||
{
|
||||
#if defined(THC_REAL_IS_HALF) || defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE)
|
||||
return THError("cbitor is only supported for integer type tensors");
|
||||
#else
|
||||
THAssert(THCTensor_(checkGPU)(state, 3, self_, src1, src2));
|
||||
THArgCheck(THCTensor_(nElement)(state, src1) ==
|
||||
THCTensor_(nElement)(state, src2), 3, "sizes do not match");
|
||||
|
||||
if (self_ == src1) {
|
||||
// self /= src2
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src2, TensorBitOrOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src1);
|
||||
|
||||
// self = src1 / src2
|
||||
if (!THC_pointwiseApply3<scalar_t, scalar_t, scalar_t>(state, self_, src1, src2, TensorBitOrOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(cbitxor)(THCState* state, THCTensor *self_, THCTensor *src1, THCTensor *src2)
|
||||
{
|
||||
#if defined(THC_REAL_IS_HALF) || defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE)
|
||||
return THError("cbitor is only supported for integer type tensors");
|
||||
#else
|
||||
THAssert(THCTensor_(checkGPU)(state, 3, self_, src1, src2));
|
||||
THArgCheck(THCTensor_(nElement)(state, src1) ==
|
||||
THCTensor_(nElement)(state, src2), 3, "sizes do not match");
|
||||
|
||||
if (self_ == src1) {
|
||||
// self /= src2
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src2, TensorBitXorOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src1);
|
||||
|
||||
// self = src1 / src2
|
||||
if (!THC_pointwiseApply3<scalar_t, scalar_t, scalar_t>(state, self_, src1, src2, TensorBitXorOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(sign)(THCState* state, THCTensor* self_, THCTensor* src) {
|
||||
THCAssertSameGPU(THCTensor_(checkGPU)(state, 2, self_, src));
|
||||
if (self_ == src) {
|
||||
if (!THC_pointwiseApply1<scalar_t>(state, self_, TensorSignOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src);
|
||||
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src, TensorSignOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
}
|
||||
|
||||
#if !defined(THC_REAL_IS_BOOL)
|
||||
|
||||
#define IMPLEMENT_CUDA_TENSOR_BASIC_FUNC_(NAME, CFUNC, REAL) \
|
||||
struct Tensor_##NAME##_##REAL##_Op { \
|
||||
__device__ __forceinline__ void operator()(scalar_t* out, scalar_t* in) const { \
|
||||
@ -75,23 +175,6 @@ IMPLEMENT_CUDA_TENSOR_BASIC_FUNC( abs, THCNumerics<scalar_t>::abs, Real)
|
||||
#undef IMPLEMENT_CUDA_TENSOR_BASIC_FUNC_
|
||||
#undef IMPLEMENT_CUDA_TENSOR_BASIC_FUNC
|
||||
|
||||
void THCTensor_(sign)(THCState* state, THCTensor* self_, THCTensor* src) {
|
||||
THCAssertSameGPU(THCTensor_(checkGPU)(state, 2, self_, src));
|
||||
if (self_ == src) {
|
||||
if (!THC_pointwiseApply1<scalar_t>(state, self_, TensorSignOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src);
|
||||
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src, TensorSignOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
}
|
||||
|
||||
void THCTensor_(clamp)(THCState *state, THCTensor *self_, THCTensor *src, scalar_t min_value,
|
||||
scalar_t max_value)
|
||||
{
|
||||
@ -552,84 +635,5 @@ void THCTensor_(addcdiv)(THCState *state, THCTensor *self_, THCTensor *t, scalar
|
||||
THCudaCheck(cudaGetLastError());
|
||||
}
|
||||
|
||||
void THCTensor_(cbitand)(THCState* state, THCTensor *self_, THCTensor *src1, THCTensor *src2)
|
||||
{
|
||||
#if defined(THC_REAL_IS_HALF) || defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE)
|
||||
return THError("cbitand is only supported for integer type tensors");
|
||||
#else
|
||||
THAssert(THCTensor_(checkGPU)(state, 3, self_, src1, src2));
|
||||
THArgCheck(THCTensor_(nElement)(state, src1) ==
|
||||
THCTensor_(nElement)(state, src2), 3, "sizes do not match");
|
||||
|
||||
if (self_ == src1) {
|
||||
// self /= src2
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src2, TensorBitAndOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src1);
|
||||
|
||||
// self = src1 / src2
|
||||
if (!THC_pointwiseApply3<scalar_t, scalar_t, scalar_t>(state, self_, src1, src2, TensorBitAndOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(cbitor)(THCState* state, THCTensor *self_, THCTensor *src1, THCTensor *src2)
|
||||
{
|
||||
#if defined(THC_REAL_IS_HALF) || defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE)
|
||||
return THError("cbitor is only supported for integer type tensors");
|
||||
#else
|
||||
THAssert(THCTensor_(checkGPU)(state, 3, self_, src1, src2));
|
||||
THArgCheck(THCTensor_(nElement)(state, src1) ==
|
||||
THCTensor_(nElement)(state, src2), 3, "sizes do not match");
|
||||
|
||||
if (self_ == src1) {
|
||||
// self /= src2
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src2, TensorBitOrOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src1);
|
||||
|
||||
// self = src1 / src2
|
||||
if (!THC_pointwiseApply3<scalar_t, scalar_t, scalar_t>(state, self_, src1, src2, TensorBitOrOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
|
||||
void THCTensor_(cbitxor)(THCState* state, THCTensor *self_, THCTensor *src1, THCTensor *src2)
|
||||
{
|
||||
#if defined(THC_REAL_IS_HALF) || defined(THC_REAL_IS_FLOAT) || defined(THC_REAL_IS_DOUBLE)
|
||||
return THError("cbitor is only supported for integer type tensors");
|
||||
#else
|
||||
THAssert(THCTensor_(checkGPU)(state, 3, self_, src1, src2));
|
||||
THArgCheck(THCTensor_(nElement)(state, src1) ==
|
||||
THCTensor_(nElement)(state, src2), 3, "sizes do not match");
|
||||
|
||||
if (self_ == src1) {
|
||||
// self /= src2
|
||||
if (!THC_pointwiseApply2<scalar_t, scalar_t>(state, self_, src2, TensorBitXorOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
} else {
|
||||
THCTensor_(resizeAs)(state, self_, src1);
|
||||
|
||||
// self = src1 / src2
|
||||
if (!THC_pointwiseApply3<scalar_t, scalar_t, scalar_t>(state, self_, src1, src2, TensorBitXorOp<scalar_t>())) {
|
||||
THArgCheck(false, 2, CUTORCH_DIM_WARNING);
|
||||
}
|
||||
}
|
||||
|
||||
THCudaCheck(cudaGetLastError());
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
@ -2,6 +2,14 @@
|
||||
#define THC_GENERIC_FILE "THC/generic/THCTensorMathPointwise.h"
|
||||
#else
|
||||
|
||||
THC_API void THCTensor_(cbitand)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2);
|
||||
THC_API void THCTensor_(cbitor)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2);
|
||||
THC_API void THCTensor_(cbitxor)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2);
|
||||
|
||||
THC_API void THCTensor_(sign)(THCState *state, THCTensor *self, THCTensor *src);
|
||||
|
||||
#if !defined(THC_REAL_IS_BOOL)
|
||||
|
||||
THC_API void THCTensor_(pow)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(tpow)(THCState *state, THCTensor *self, scalar_t value, THCTensor *src);
|
||||
THC_API void THCTensor_(cpow)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2);
|
||||
@ -45,7 +53,6 @@ THC_API void THCTensor_(cinv)(THCState *state, THCTensor *self, THCTensor *src);
|
||||
|
||||
THC_API void THCTensor_(neg)(THCState *state, THCTensor *self, THCTensor *src);
|
||||
THC_API void THCTensor_(abs)(THCState *state, THCTensor *self, THCTensor *src);
|
||||
THC_API void THCTensor_(sign)(THCState *state, THCTensor *self, THCTensor *src);
|
||||
THC_API void THCTensor_(clamp)(THCState *state, THCTensor *self, THCTensor *src, scalar_t min_value, scalar_t max_value);
|
||||
THC_API void THCTensor_(crossKernel)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2, int dimension);
|
||||
|
||||
@ -61,11 +68,9 @@ THC_API void THCTensor_(cfmod)(THCState *state, THCTensor *self, THCTensor *src1
|
||||
THC_API void THCTensor_(cremainder)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2);
|
||||
THC_API void THCTensor_(cmaxValue)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(cminValue)(THCState *state, THCTensor *self, THCTensor *src, scalar_t value);
|
||||
THC_API void THCTensor_(cbitand)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2);
|
||||
THC_API void THCTensor_(cbitor)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2);
|
||||
THC_API void THCTensor_(cbitxor)(THCState *state, THCTensor *self, THCTensor *src1, THCTensor *src2);
|
||||
|
||||
THC_API void THCTensor_(addcmul)(THCState *state, THCTensor *self, THCTensor* t, scalar_t value, THCTensor *src1, THCTensor *src2);
|
||||
THC_API void THCTensor_(addcdiv)(THCState *state, THCTensor *self, THCTensor* t, scalar_t value, THCTensor *src1, THCTensor *src2);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
@ -21,7 +21,6 @@ THC_API accreal THCTensor_(varall)(THCState *state, THCTensor *self, int biased)
|
||||
|
||||
THC_API void THCTensor_(prod)(THCState *state, THCTensor *self, THCTensor *src, int dim, int keepdim);
|
||||
|
||||
THC_API accreal THCTensor_(sumall)(THCState *state, THCTensor *self);
|
||||
THC_API accreal THCTensor_(meanall)(THCState *state, THCTensor *self);
|
||||
|
||||
THC_API void THCTensor_(min)(THCState *state,
|
||||
|
Reference in New Issue
Block a user