| 67 | |
| 68 | template<typename T, af_op_t op> |
| 69 | static inline af_array arithOpBroadcast(const af_array lhs, |
| 70 | const af_array rhs) { |
| 71 | const ArrayInfo &linfo = getInfo(lhs); |
| 72 | const ArrayInfo &rinfo = getInfo(rhs); |
| 73 | |
| 74 | dim4 odims(1), ltile(1), rtile(1); |
| 75 | dim4 lshape = linfo.dims(); |
| 76 | dim4 rshape = rinfo.dims(); |
| 77 | |
| 78 | for (int d = 0; d < AF_MAX_DIMS; ++d) { |
| 79 | DIM_ASSERT( |
| 80 | 1, ((lshape[d] == rshape[d]) || (lshape[d] == 1 && rshape[d] > 1) || |
| 81 | (lshape[d] > 1 && rshape[d] == 1))); |
| 82 | odims[d] = std::max(lshape[d], rshape[d]); |
| 83 | if (lshape[d] == rshape[d]) { |
| 84 | ltile[d] = rtile[d] = 1; |
| 85 | } else if (lshape[d] == 1 && rshape[d] > 1) { |
| 86 | ltile[d] = odims[d]; |
| 87 | } else if (lshape[d] > 1 && rshape[d] == 1) { |
| 88 | rtile[d] = odims[d]; |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | Array<T> lhst = |
| 93 | arrayfire::common::tile<T>(modDims(getArray<T>(lhs), lshape), ltile); |
| 94 | Array<T> rhst = |
| 95 | arrayfire::common::tile<T>(modDims(getArray<T>(rhs), rshape), rtile); |
| 96 | |
| 97 | return getHandle(arithOp<T, op>(lhst, rhst, odims)); |
| 98 | } |
| 99 | |
| 100 | template<typename T, af_op_t op> |
| 101 | static inline af_array sparseArithOp(const af_array lhs, const af_array rhs) { |