18 for (
int i = 0; i < rank; ++i) {
27 nodes_.push_back(std::move(
node));
28 return int(nodes_.size()) - 1;
41 if (tracing_ && owner_) owner_->
popTrace(
this);
49 for (
int i = 0; i < rank; ++i)
n.dims[i] = dims[i];
54Tensor *Func::makeSymbolicFromNode(
int nodeId) {
55 const auto &
n = graph_.
node(nodeId);
57 t->setDtype(
static_cast<DType>(
n.dtype));
63GraphNode makeInputNode(Graph &
graph,
OpType type,
const int *dims,
int rank,
int slot) {
68 for (
int i = 0; i < rank; ++i)
n.dims[i] = dims[i];
70 n.placeholderSlot = slot;
74int normalizeAxisChecked(
int axis,
int rank) {
75 if (axis < 0) axis += rank;
76 if (axis < 0 || axis >= rank)
throw eve::Exception(
"Func: axis out of range");
80int convOutSize(
int inSize,
int kernel,
int stride,
int pad) {
81 const int out = (inSize + 2 * pad - kernel) / stride + 1;
82 if (out <= 0)
throw eve::Exception(
"Func: conv output size must be > 0");
91 return makeSymbolicFromNode(
id);
97 return makeSymbolicFromNode(
id);
101 int d[] = {d0, d1, d2};
103 return makeSymbolicFromNode(
id);
107 int d[] = {d0, d1, d2, d3};
109 return makeSymbolicFromNode(
id);
113 int d[] = {d0, d1, d2, d3, d4};
115 return makeSymbolicFromNode(
id);
119 int d[] = {d0, d1, d2, d3, d4, d5};
121 return makeSymbolicFromNode(
id);
144 n.dtype =
static_cast<int>(t->dtype_);
145 return graph_.
addNode(std::move(
n));
150 n.constData.assign(
static_cast<size_t>(
n.size),
value);
151 int id = graph_.
addNode(std::move(
n));
152 return makeSymbolicFromNode(
id);
157 const auto &src = graph_.
node(ix);
158 auto n = makeShapeNode(
type, src.dims, src.rank);
161 int id = graph_.
addNode(std::move(
n));
162 return makeSymbolicFromNode(
id);
167 const auto &src = graph_.
node(ix);
168 auto n = makeShapeNode(
type, src.dims, src.rank);
173 int id = graph_.
addNode(std::move(
n));
174 return makeSymbolicFromNode(
id);
180 const auto &na = graph_.
node(ia);
181 const auto &nb = graph_.
node(ib);
186 auto n = makeShapeNode(
type, od, orank);
189 int id = graph_.
addNode(std::move(
n));
190 return makeSymbolicFromNode(
id);
197 const auto &na = graph_.
node(ia);
198 auto n = makeShapeNode(
type, na.dims, na.rank);
202 int id = graph_.
addNode(std::move(
n));
203 return makeSymbolicFromNode(
id);
209 const auto &na = graph_.
node(ia);
210 const auto &nb = graph_.
node(ib);
211 if (na.rank == 2 && nb.rank == 2) {
212 if (na.dims[1] != nb.dims[0])
throw eve::Exception(
"Func.matmul: inner dims mismatch");
213 int od[] = {na.dims[0], nb.dims[1]};
217 int id = graph_.
addNode(std::move(
n));
218 return makeSymbolicFromNode(
id);
220 if (na.rank == 3 && nb.rank == 3) {
221 if (na.dims[0] != nb.dims[0] || na.dims[2] != nb.dims[1])
223 int od[] = {na.dims[0], na.dims[1], nb.dims[2]};
227 int id = graph_.
addNode(std::move(
n));
228 return makeSymbolicFromNode(
id);
235 const auto &src = graph_.
node(ix);
236 if (src.rank != 2)
throw eve::Exception(
"Func.transpose: rank 2 required");
237 int order[] = {1, 0};
243 const auto &src = graph_.
node(ix);
244 if (rank != src.rank)
throw eve::Exception(
"Func.permute: rank mismatch");
246 for (
int k = 0; k < rank; ++k) {
247 if (order[k] < 0 || order[k] >= rank)
249 od[k] = src.dims[order[k]];
253 for (
int k = 0; k < rank; ++k)
n.perm[k] = order[k];
255 int id = graph_.
addNode(std::move(
n));
256 return makeSymbolicFromNode(
id);
261 const auto &src = graph_.
node(ix);
263 if (newSize != src.size)
throw eve::Exception(
"Func.reshape: size mismatch");
267 int id = graph_.
addNode(std::move(
n));
268 return makeSymbolicFromNode(
id);
273 const auto &src = graph_.
node(ix);
274 axis = normalizeAxisChecked(axis, src.rank);
278 int id = graph_.
addNode(std::move(
n));
279 return makeSymbolicFromNode(
id);
284void checkParamVector(
const GraphNode &src,
int cols,
const char *what) {
285 if (src.
rank == 1 && src.
dims[0] == cols)
return;
286 if (src.
rank == 2 && src.
dims[0] == 1 && src.
dims[1] == cols)
return;
294 const auto &src = graph_.
node(ix);
296 const int cols = src.
dims[src.
rank - 1];
302 checkParamVector(graph_.
node(is), cols,
"layernorm scale");
307 checkParamVector(graph_.
node(ib), cols,
"layernorm bias");
310 int id = graph_.
addNode(std::move(
n));
311 return makeSymbolicFromNode(
id);
316 const auto &src = graph_.
node(ix);
318 const int cols = src.
dims[src.
rank - 1];
324 checkParamVector(graph_.
node(is), cols,
"rmsnorm scale");
327 int id = graph_.
addNode(std::move(
n));
328 return makeSymbolicFromNode(
id);
335 const auto &nx = graph_.
node(ix);
336 const auto &nw = graph_.
node(iw);
337 if (nx.rank != 3 || nw.rank != 3)
throw eve::Exception(
"Func.conv1d: rank 3 required");
338 if (nx.dims[1] != nw.dims[1])
throw eve::Exception(
"Func.conv1d: channel mismatch");
339 const int OL = convOutSize(nx.dims[2], nw.dims[2], stride, pad);
340 int od[] = {nx.dims[0], nw.dims[0], OL};
348 const auto &nb = graph_.
node(ib);
349 if (nb.rank != 1 || nb.dims[0] != nw.dims[0])
353 int id = graph_.
addNode(std::move(
n));
354 return makeSymbolicFromNode(
id);
361 const auto &nx = graph_.
node(ix);
362 const auto &nw = graph_.
node(iw);
363 if (nx.rank != 4 || nw.rank != 4)
throw eve::Exception(
"Func.conv2d: rank 4 required");
364 if (nx.dims[1] != nw.dims[1])
throw eve::Exception(
"Func.conv2d: channel mismatch");
365 const int OH = convOutSize(nx.dims[2], nw.dims[2], stride, pad);
366 const int OW = convOutSize(nx.dims[3], nw.dims[3], stride, pad);
367 int od[] = {nx.dims[0], nw.dims[0], OH, OW};
375 const auto &nb = graph_.
node(ib);
376 if (nb.rank != 1 || nb.dims[0] != nw.dims[0])
380 int id = graph_.
addNode(std::move(
n));
381 return makeSymbolicFromNode(
id);
386 const auto &src = graph_.
node(ix);
388 const int OH = convOutSize(src.
dims[2], ksize, stride, pad);
389 const int OW = convOutSize(src.
dims[3], ksize, stride, pad);
390 int od[] = {src.
dims[0], src.
dims[1], OH, OW};
391 auto n = makeShapeNode(
type, od, 4);
396 int id = graph_.
addNode(std::move(
n));
397 return makeSymbolicFromNode(
id);
403 const auto &nt = graph_.
node(it);
404 const auto &ni = graph_.
node(ii);
405 if (nt.rank != 2)
throw eve::Exception(
"Func.embedding: table rank 2 required");
409 for (
int k = 0; k < ni.rank; ++k) od[k] = ni.dims[k];
410 od[ni.rank] = nt.dims[1];
414 int id = graph_.
addNode(std::move(
n));
415 return makeSymbolicFromNode(
id);
419 if (!ins || n < 2 || n > 4)
throw eve::Exception(
"Func.concat: 2..4 inputs required");
422 for (
int k = 0; k <
n; ++k) {
424 ns[k] = &graph_.
node(ids[k]);
425 if (ns[k]->rank != ns[0]->rank)
428 axis = normalizeAxisChecked(axis, ns[0]->rank);
430 for (
int k = 0; k < ns[0]->
rank; ++k) {
433 for (
int t = 0; t <
n; ++t) total += ns[t]->dims[k];
436 od[k] = ns[0]->
dims[k];
437 for (
int t = 1; t <
n; ++t)
438 if (ns[t]->dims[k] != od[k])
445 if (
n > 2) g.in2 = ids[2];
446 if (
n > 3) g.in3 = ids[3];
448 int id = graph_.
addNode(std::move(g));
449 return makeSymbolicFromNode(
id);
454 const auto &src = graph_.
node(ix);
455 axis = normalizeAxisChecked(axis, src.
rank);
456 if (begin < 0 || end < begin || end > src.
dims[axis])
459 for (
int k = 0; k < src.
rank; ++k) od[k] = src.
dims[k];
460 od[axis] = end - begin;
466 int id = graph_.
addNode(std::move(
n));
467 return makeSymbolicFromNode(
id);
472 const auto &src = graph_.
node(ix);
473 axis = normalizeAxisChecked(axis, src.
rank);
475 int orank = src.
rank;
476 for (
int k = 0; k < src.
rank; ++k) od[k] = src.
dims[k];
483 for (
int k = axis; k < orank - 1; ++k) od[k] = od[k + 1];
488 auto n = makeShapeNode(
type, od, orank);
491 n.i1 = keepDims ? 1 : 0;
492 int id = graph_.
addNode(std::move(
n));
493 return makeSymbolicFromNode(
id);
498 const auto &src = graph_.
node(ix);
499 axis = normalizeAxisChecked(axis, src.
rank);
501 int orank = src.
rank;
502 for (
int k = 0; k < src.
rank; ++k) od[k] = src.
dims[k];
509 for (
int k = axis; k < orank - 1; ++k) od[k] = od[k + 1];
517 n.i1 = keepDims ? 1 : 0;
519 int id = graph_.
addNode(std::move(
n));
520 return makeSymbolicFromNode(
id);
525 const auto &src = graph_.
node(ix);
528 n.dtype =
static_cast<int>(dtype);
529 int id = graph_.
addNode(std::move(
n));
530 return makeSymbolicFromNode(
id);
538 const auto &nq = graph_.
node(iq);
539 const auto &nk = graph_.
node(ik);
540 const auto &nv = graph_.
node(iv);
541 if (nq.rank != 4 || nk.rank != 4 || nv.rank != 4)
543 if (nq.dims[0] != nk.dims[0] || nq.dims[1] != nk.dims[1] ||
544 nq.dims[3] != nk.dims[3] || nk.dims[2] != nv.dims[2] || nq.dims[3] != nv.dims[3])
553 const auto &nm = graph_.
node(im);
554 if (nm.rank != 4 || nm.dims[0] != nq.dims[0] || nm.dims[1] != nq.dims[1] ||
555 nm.dims[2] != nq.dims[2] || nm.dims[3] != nk.dims[2])
559 int id = graph_.
addNode(std::move(
n));
560 return makeSymbolicFromNode(
id);
565 const auto &src = graph_.
node(ix);
567 if (outH <= 0 || outW <= 0)
throw eve::Exception(
"Func.resize2d: bad output size");
568 int od[] = {src.
dims[0], src.
dims[1], outH, outW};
572 int id = graph_.
addNode(std::move(
n));
573 return makeSymbolicFromNode(
id);
584 if (outputNode_ < 0)
throw eve::Exception(
"Func.compile: setOutput required");
593 cf->graph_ =
fn->graph();
594 cf->outputNode_ =
fn->outputNode();
595 cf->placeholderCount_ =
fn->placeholderCount();
597 cf->optimized_ = std::make_unique<OptimizedGraph>(
optimizeGraph(cf->graph_, cf->outputNode_));
598 cf->order_ = cf->optimized_->order;
605 cf->gpuProgram_.reset();
607 if (cf->gpuProgram_) cf->device_ =
"gpu";
615 return runWithFeeds(feeds, 1);
619 Tensor *feeds[] = {in0, in1};
620 return runWithFeeds(feeds, 2);
624 Tensor *feeds[] = {in0, in1, in2};
625 return runWithFeeds(feeds, 3);
629 Tensor *feeds[] = {in0, in1, in2, in3};
630 return runWithFeeds(feeds, 4);
634 Tensor *feeds[] = {in0, in1, in2, in3, in4};
635 return runWithFeeds(feeds, 5);
640 Tensor *feeds[] = {in0, in1, in2, in3, in4, in5};
641 return runWithFeeds(feeds, 6);
644Tensor *CompiledFunction::runWithFeeds(
Tensor *
const *feeds,
int nFeeds) {
645 if (nFeeds != placeholderCount_)
646 throw eve::Exception(
"CompiledFunction.run: expected %d feeds, got %d", placeholderCount_,
648 for (
int i = 0; i < nFeeds; ++i) {
649 if (!feeds[i])
throw eve::Exception(
"CompiledFunction.run: null feed");
656 for (
int i = 0; i <
n; ++i) {
657 const auto &nd = graph_.
node(i);
660 if (slot < 0 || slot >= nFeeds)
throw eve::Exception(
"CompiledFunction: bad placeholder slot");
661 Tensor *feed = feeds[slot];
662 if (feed->getRank() != nd.rank || feed->getSize() != nd.size)
664 for (
int a = 0;
a < nd.rank; ++
a)
665 if (feed->getDim(
a) != nd.dims[
a])
669 const auto &outN = graph_.
node(outputNode_);
672 std::vector<const float *> ptrs(
static_cast<size_t>(nFeeds));
673 for (
int i = 0; i < nFeeds; ++i) ptrs[static_cast<size_t>(i)] = feeds[i]->
data();
674 std::vector<float> result = gpuProgram_->run(ptrs);
675 auto *out =
new Tensor(
static_cast<DType>(outN.dtype), outN.dims, outN.rank);
676 if (
int(result.size()) != out->getSize())
677 throw eve::Exception(
"CompiledFunction: gpu output size mismatch");
678 std::memcpy(out->data(), result.data(),
sizeof(
float) *
static_cast<size_t>(out->getSize()));
682 std::vector<std::vector<float>> bufs(
static_cast<size_t>(
n));
683 for (
int i = 0; i <
n; ++i) {
684 const auto &nd = graph_.
node(i);
686 Tensor *feed = feeds[nd.placeholderSlot];
687 bufs[
static_cast<size_t>(i)].assign(feed->data(), feed->data() + feed->getSize());
690 for (
int nodeId : order_) executeNode(nodeId, bufs);
692 auto *out =
new Tensor(
static_cast<DType>(outN.dtype), outN.dims, outN.rank);
693 const auto &src = bufs[
static_cast<size_t>(outputNode_)];
694 if (
int(src.
size()) != out->getSize())
696 std::memcpy(out->data(), src.data(),
sizeof(
float) *
static_cast<size_t>(out->getSize()));
700void CompiledFunction::executeNode(
int nodeId, std::vector<std::vector<float>> &bufs)
const {
701 const auto &nd = graph_.
node(nodeId);
702 auto &out = bufs[
static_cast<size_t>(nodeId)];
703 const auto in = [&](
int id) ->
const std::vector<float> & {
704 return bufs[
static_cast<size_t>(
id)];
711 if (!nd.constBytes.empty()) {
712 out.assign(
static_cast<size_t>(nd.size), 0.f);
714 nd.constScales.data(), nd.qGroup, nd.size, out.data());
723 const auto &na = graph_.
node(nd.in0);
724 const auto &nb = graph_.
node(nd.in1);
725 out.resize(
static_cast<size_t>(nd.size));
726 kernels::binaryOp(nd.type, in(nd.in0).data(), na.dims, na.rank, in(nd.in1).data(),
727 nb.dims, nb.rank, out.data(), nd.dims, nd.rank);
750 out.resize(
static_cast<size_t>(nd.size));
751 kernels::unaryOp(nd.type, in(nd.in0).data(), nd.size, out.data(), nd.s0, nd.s1);
755 const auto &
c = in(nd.in0);
756 const auto &
a = in(nd.in1);
757 const auto &
b = in(nd.in2);
758 out.resize(
static_cast<size_t>(nd.size));
759 for (
int i = 0; i < nd.size; ++i)
760 out[
static_cast<size_t>(i)] =
761 c[
static_cast<size_t>(i)] > 0.5f ?
a[
static_cast<size_t>(i)]
762 :
b[
static_cast<size_t>(i)];
766 const auto &A = graph_.
node(nd.in0);
767 const auto &B = graph_.
node(nd.in1);
768 const auto &
a = in(nd.in0);
769 const auto &
b = in(nd.in1);
770 out.assign(
static_cast<size_t>(nd.size), 0.f);
772 const int m = A.dims[0], k = A.dims[1],
n = B.dims[1];
773 for (
int i = 0; i <
m; ++i) {
774 for (
int j = 0; j <
n; ++j) {
776 for (
int t = 0; t < k; ++t)
777 acc +=
double(
a[
static_cast<size_t>(i * k + t)]) *
778 double(
b[
static_cast<size_t>(t *
n + j)]);
779 out[
static_cast<size_t>(i *
n + j)] =
float(acc);
783 const int batch = A.dims[0],
m = A.dims[1], k = A.dims[2],
n = B.dims[2];
784 for (
int bb = 0; bb < batch; ++bb) {
785 const float *ap =
a.data() + size_t(bb) *
m * k;
786 const float *bp =
b.data() + size_t(bb) * k *
n;
787 float *cp = out.data() + size_t(bb) *
m *
n;
788 for (
int i = 0; i <
m; ++i)
789 for (
int j = 0; j <
n; ++j) {
791 for (
int t = 0; t < k; ++t) acc +=
double(ap[i * k + t]) * double(bp[t *
n + j]);
792 cp[i *
n + j] = float(acc);
800 const auto &
X = graph_.
node(nd.in0);
801 out.resize(
static_cast<size_t>(nd.size));
803 for (
int k = 0; k < nd.rank; ++k)
805 kernels::permute(in(nd.in0).data(),
X.dims, nd.rank, order, out.data(), nd.dims);
815 out.resize(
static_cast<size_t>(nd.size));
821 out.resize(
static_cast<size_t>(nd.size));
822 const int cols = nd.dims[nd.rank - 1];
823 const int rows = nd.size / cols;
825 nd.in1 >= 0 ? in(nd.in1).data() : nullptr,
826 nd.in2 >= 0 ? in(nd.in2).
data() : nullptr, nd.s0, out.
data());
830 out.resize(
static_cast<size_t>(nd.size));
831 const int cols = nd.dims[nd.rank - 1];
832 const int rows = nd.size / cols;
834 nd.in1 >= 0 ? in(nd.in1).data() : nullptr, nd.s0, out.
data());
839 out.resize(
static_cast<size_t>(nd.size));
840 const auto &
X = graph_.
node(nd.in0);
841 const auto &W = graph_.
node(nd.in1);
844 nd.in2 >= 0 ? in(nd.in2).data() : nullptr, nd.
i0, nd.
i1, out.
data());
847 nd.in2 >= 0 ? in(nd.in2).data() : nullptr, nd.
i0, nd.
i1, out.
data());
852 out.resize(
static_cast<size_t>(nd.size));
853 const auto &
X = graph_.
node(nd.in0);
861 out.resize(
static_cast<size_t>(nd.size));
862 const auto &T = graph_.
node(nd.in0);
863 const auto &I = graph_.
node(nd.in1);
869 out.resize(
static_cast<size_t>(nd.size));
870 const float *ins[4] = {};
871 const int *dims[4] = {};
874 if (nd.in3 >= 0)
n = 4;
875 else if (nd.in2 >= 0)
n = 3;
876 const int ids[4] = {nd.in0, nd.in1, nd.in2, nd.in3};
877 for (
int k = 0; k <
n; ++k) {
878 ins[k] = in(ids[k]).data();
880 ranks[k] = graph_.
node(ids[k]).
rank;
886 out.resize(
static_cast<size_t>(nd.size));
887 const auto &
X = graph_.
node(nd.in0);
896 out.resize(
static_cast<size_t>(nd.size));
897 const auto &
X = graph_.
node(nd.in0);
903 out.resize(
static_cast<size_t>(nd.size));
904 const auto &
X = graph_.
node(nd.in0);
910 out.resize(
static_cast<size_t>(nd.size));
911 const auto &Q = graph_.
node(nd.in0);
912 const auto &K = graph_.
node(nd.in1);
913 const int B = Q.
dims[0], H = Q.dims[1], T = Q.dims[2], D = Q.dims[3];
914 const int S = K.dims[2];
915 kernels::sdpa(in(nd.in0).data(), in(nd.in1).data(), in(nd.in2).data(),
916 nd.in3 >= 0 ? in(nd.in3).data() : nullptr, B, H, T, S, D, nd.s0,
921 out.resize(
static_cast<size_t>(nd.size));
922 const auto &
X = graph_.
node(nd.in0);
SettlementPipeline::Stage fn
Optimized / scheduled graph ready to run with feeds.
Tensor * run1(Tensor *in0)
Tensor * run2(Tensor *in0, Tensor *in1)
Tensor * run5(Tensor *in0, Tensor *in1, Tensor *in2, Tensor *in3, Tensor *in4)
Tensor * run4(Tensor *in0, Tensor *in1, Tensor *in2, Tensor *in3)
Tensor * run3(Tensor *in0, Tensor *in1, Tensor *in2)
Tensor * run6(Tensor *in0, Tensor *in1, Tensor *in2, Tensor *in3, Tensor *in4, Tensor *in5)
static CompiledFunction * fromFunc(Func *fn)
Trace builder — TF2 tf.function analogue (tf.func in scripts). While active, TF ops record into this ...
Tensor * emitReduce(OpType type, const Tensor *x, int axis, bool keepDims)
Tensor * emitCast(const Tensor *x, DType dtype)
Tensor * emitPermute(const Tensor *x, const int *order, int rank)
class CompiledFunction * compile()
Tensor * input6(int d0, int d1, int d2, int d3, int d4, int d5)
Tensor * emitResize2d(const Tensor *x, int outH, int outW, int mode)
Tensor * input4(int d0, int d1, int d2, int d3)
Tensor * emitConcat(const Tensor *const *ins, int n, int axis)
Tensor * input5(int d0, int d1, int d2, int d3, int d4)
Tensor * emitPool(OpType type, const Tensor *x, int ksize, int stride, int pad)
Tensor * emitSdpa(const Tensor *q, const Tensor *k, const Tensor *v, const Tensor *mask, float scale)
Tensor * emitBinary(OpType type, const Tensor *a, const Tensor *b)
Tensor * emitSoftmax(const Tensor *x, int axis, bool logMode)
Tensor * emitConv1d(const Tensor *x, const Tensor *w, const Tensor *bias, int stride, int pad)
Tensor * emitTernary(OpType type, const Tensor *a, const Tensor *b, const Tensor *c)
Tensor * emitFill(const int *dims, int rank, float value)
void setOutput(Tensor *t)
Tensor * emitEmbedding(const Tensor *table, const Tensor *indices)
Tensor * emitConv2d(const Tensor *x, const Tensor *w, const Tensor *bias, int stride, int pad)
Tensor * emitArgMax(const Tensor *x, int axis, bool keepDims)
Tensor * emitMatMul(const Tensor *a, const Tensor *b)
Tensor * emitUnaryScalar(OpType type, const Tensor *x, float s0, float s1=0.f)
Tensor * input2(int d0, int d1)
Tensor * emitReshape(const Tensor *x, const int *dims, int rank)
Tensor * emitSlice(const Tensor *x, int axis, int begin, int end)
Tensor * emitUnary(OpType type, const Tensor *x)
Tensor * emitTranspose(const Tensor *x)
Tensor * input3(int d0, int d1, int d2)
int ensureNode(const Tensor *t)
Ensure tensor is a node in this graph (Const-capture if eager).
Tensor * emitLayerNorm(const Tensor *x, const Tensor *scale, const Tensor *bias, float eps)
Tensor * emitRMSNorm(const Tensor *x, const Tensor *scale, float eps)
static GpuProgram * tryBuild(const Graph &graph, const OptimizedGraph &opt, int outputNode)
int addNode(GraphNode node)
const GraphNode & node(int id) const
static int product(const int *dims, int rank)
TF2-like namespace module. Script: tf <- eve.TF(); Default eager; tf.func() traces a graph for compil...
float32 / int32 tensor (rank 1–6), row-major. Eager: owns a buffer. Symbolic: node in a Func graph (n...
const std::vector< float > & qScales() const
void ensureEager(const char *op) const
static constexpr int kMaxRank
const std::vector< uint8_t > & qBytes() const
float * data()
原始数据指针(eager)。
static Tensor * makeSymbolic(Graph *graph, int nodeId, const int *dims, int rank)
Symbolic handle into a graph node.
void maxpool2d(const float *in, const int *dims, int ksize, int stride, int pad, float *out)
void softmax(const float *in, const int *dims, int rank, int axis, bool logMode, float *out)
void conv2d(const float *x, const int *xDims, const float *w, const int *wDims, const float *bias, int stride, int pad, float *out)
void sdpa(const float *q, const float *k, const float *v, const float *mask, int B, int H, int T, int S, int D, float scale, float *out)
void sliceOp(const float *in, const int *inDims, int inRank, int axis, int begin, int end, float *out, const int *outDims, int outRank)
void embedding(const float *table, int vocab, int dim, const float *indices, int count, float *out)
void avgpool2d(const float *in, const int *dims, int ksize, int stride, int pad, float *out)
void binaryOp(OpType type, const float *a, const int *aDims, int aRank, const float *b, const int *bDims, int bRank, float *out, const int *outDims, int outRank)
void permute(const float *in, const int *inDims, int rank, const int *order, float *out, const int *outDims)
void reduceAxis(OpType type, const float *in, const int *dims, int rank, int axis, float *out, const int *outDims, int outRank)
bool broadcastShape(const int *aDims, int aRank, const int *bDims, int bRank, int *outDims, int &outRank)
void argmax(const float *in, const int *dims, int rank, int axis, float *out, const int *outDims, int outRank)
void layernorm(const float *in, int rows, int cols, const float *scale, const float *bias, float eps, float *out)
void rmsnorm(const float *in, int rows, int cols, const float *scale, float eps, float *out)
void concat(const float *const *ins, const int *const *inDims, const int *inRanks, int n, int axis, float *out, const int *outDims, int outRank)
void conv1d(const float *x, const int *xDims, const float *w, const int *wDims, const float *bias, int stride, int pad, float *out)
void unaryOp(OpType type, const float *in, int count, float *out, float s0, float s1)
void resize2d(const float *in, const int *inDims, int outW, int outH, int mode, float *out)
void dequantizeAll(DType dt, const uint8_t *bytes, const float *scales, int group, int count, float *out)
DType
Tensor element types.
@ ScaledDotProductAttention
OptimizedGraph optimizeGraph(const Graph &graph, int outputNode)
int dims[Tensor::kMaxRank]