lib/accy/src/kernel/library/catalog/artifact/specialized/loss.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2
3 const kernel = @import("../../../../root.zig");
4 const entry = @import("../../../root.zig").entry;
5 const loss = @import("../../../root.zig").loss;
6
7 pub fn create(
8 allocator: std.mem.Allocator,
9 handle: kernel.BackendHandle,
10 metadata: entry.Metadata,
11 options: entry.ArtifactOptions,
12 ) !kernel.OwnedKernelCallArtifact {
13 return switch (metadata.specialization.operation orelse return error.UnknownKernelLibraryEntry) {
14 .loss => |loss_operation| switch (loss_operation) {
15 .row_sparse_cross_entropy => createRowSparseCrossEntropy(allocator, handle, metadata, options),
16 },
17 else => error.UnknownKernelLibraryEntry,
18 };
19 }
20
21 fn createRowSparseCrossEntropy(
22 allocator: std.mem.Allocator,
23 handle: kernel.BackendHandle,
24 metadata: entry.Metadata,
25 options: entry.ArtifactOptions,
26 ) !kernel.OwnedKernelCallArtifact {
27 if (metadata.version != loss.row_sparse_cross_entropy_family_version) return error.UnknownKernelLibraryEntry;
28 const instance = loss.rowSparseCrossEntropyInstanceFromSpecialization(metadata.specialization) orelse {
29 return error.UnknownKernelLibraryEntry;
30 };
31 const target = try loss.rowSparseCrossEntropyFamilyTarget(allocator, instance);
32 defer allocator.free(target);
33 if (!std.mem.eql(u8, metadata.target, target)) return error.UnknownKernelLibraryEntry;
34 return try loss.createRowSparseCrossEntropyFamilyArtifact(allocator, handle, instance, options);
35 }