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 }