| 413 | /*inner_dim_reordered=*/false, Alignment>; \ |
| 414 | \ |
| 415 | static bool block(const typename DataMapper::SubMapper& data_mapper, \ |
| 416 | const StorageIndex rows, const StorageIndex cols, \ |
| 417 | const StorageIndex num_kernels, \ |
| 418 | ColMajorBlock<Scalar, StorageIndex>* block) { \ |
| 419 | static_assert(DataMapper::DirectOffsets == true, \ |
| 420 | "DataMapper must support direct offsets"); \ |
| 421 | \ |
| 422 | const StorageIndex vert_offset = data_mapper.vert_offset(); \ |
| 423 | const StorageIndex horiz_offset = data_mapper.horiz_offset(); \ |
| 424 | const StorageIndex stride = \ |
| 425 | Side == Lhs ? data_mapper.base_mapper().stride() \ |
| 426 | : data_mapper.base_mapper().nocontract_strides()[0]; \ |
| 427 | const Scalar* data = data_mapper.base_mapper().tensor().data(); \ |
| 428 | data = Side == Lhs ? data : data + vert_offset + horiz_offset * stride; \ |
| 429 | \ |
| 430 | const bool is_no_op_packing = stride == rows; \ |
| 431 | const StorageIndex addressable_mem = (stride * cols * sizeof(Scalar)); \ |
| 432 | const bool use_direct_access = \ |
| 433 | is_no_op_packing || num_kernels == 1 /* used once */ || \ |
| 434 | ((num_kernels == 2) && \ |
| 435 | (addressable_mem < (256 << 10) /* 256 kb */)); \ |
| 436 | \ |
| 437 | if (use_direct_access) { \ |
| 438 | block->is_direct_access = true; \ |
| 439 | block->raw_data = const_cast<Scalar*>(data); \ |
| 440 | block->stride = stride; \ |
| 441 | block->transpose = 'N'; \ |
| 442 | return true; \ |
| 443 | } \ |
| 444 | return false; \ |
| 445 | } \ |
| 446 | } |
| 447 | |
| 448 | #define SIMPLE_TENSOR const Tensor<Scalar, 2, Eigen::ColMajor, StorageIndex> |