Description
In all the codegenerated convolutions calls (like in Conv, Conv_Clip, Conv_Relu..) before the conv operation cast_lean() is called on the Kernel of the convolution.
//--KERNEL CAST--
if (need_kernel_cast) {
// Generate cast for kernel
const kernel_name = try IR_utils.getSanitizedName(self.op_Conv.input_W.name);
_ = try writer.print(
\\
\\ // Cast kernel from {s} to {s}
\\ var tensor_{s}_casted = Tensor({s}).fromShape(&allocator, @constCast(param_lib.tensor_{s}.shape)) catch return -2;
\\ defer tensor_{s}_casted.deinit();
\\ tensMath.cast_lean({s}, {s}, @constCast(¶m_lib.tensor_{s}), &tensor_{s}_casted, zant.onnx.DataType.FLOAT) catch return -1;
\\
, .{
self.op_Conv.input_W.ty.toString(),
target_type,
kernel_name,
target_type,
kernel_name,
kernel_name,
self.op_Conv.input_W.ty.toString(),
target_type,
kernel_name,
kernel_name,
});
final_kernel_string = try std.mem.concat(allocator, u8, &[_][]const u8{ "@constCast(&tensor_", kernel_name, "_casted)" });
need_free_kernel = true;
} else {
final_kernel_string = tensor_W_string;
}
Why? Isn't it an unnecessary step? Shouldn't we have the kernels already in the correct form? if not, why aren't we doing the casting when needed instead of adding another element-wise operation before?
Expected Behavior
Correct functioning without the cast_lean() on the kernel.
Description
In all the codegenerated convolutions calls (like in Conv, Conv_Clip, Conv_Relu..) before the conv operation cast_lean() is called on the Kernel of the convolution.
Why? Isn't it an unnecessary step? Shouldn't we have the kernels already in the correct form? if not, why aren't we doing the casting when needed instead of adding another element-wise operation before?
Expected Behavior
Correct functioning without the
cast_lean()on the kernel.