internal static void GetTypeAndWidth(Tensors.TensorElementType elemType, out Type type, out int width) { TensorElementTypeInfo result = TensorBase.GetElementTypeInfo(elemType); if (result != null) { type = result.TensorType; width = result.TypeSize; } else { throw new ArgumentException("Unable to get information for type: " + elemType.ToString()); } }
/// <summary> /// Constructor /// </summary> /// <param name="memInfo">use to accurately describe a piece of memory that this is wrapping</param> /// <param name="shape">shape of this buffer</param> /// <param name="elementType">element type</param> /// <param name="pointer">the actual pointer to memory</param> /// <param name="sizeInBytes">size of the allocation in bytes</param> public OrtExternalAllocation(OrtMemoryInfo memInfo, long[] shape, Tensors.TensorElementType elementType, IntPtr pointer, long sizeInBytes) { Type type; int width; if (!TensorElementTypeConverter.GetTypeAndWidth(elementType, out type, out width)) { throw new OnnxRuntimeException(ErrorCode.InvalidArgument, "Unable to query type information for data type: " + elementType.ToString()); } if (elementType == TensorElementType.String) { throw new OnnxRuntimeException(ErrorCode.InvalidArgument, "Strings are not supported by this API"); } var shapeSize = ArrayUtilities.GetSizeForShape(shape); var requiredBufferSize = shapeSize * width; if (requiredBufferSize > sizeInBytes) { var message = String.Format("Shape of {0} elements requires a buffer of at least {1} bytes. Provided: {2} bytes", shapeSize, requiredBufferSize, sizeInBytes); throw new OnnxRuntimeException(ErrorCode.InvalidArgument, message); } Info = memInfo; Shape = shape; ElementType = elementType; Pointer = pointer; Size = sizeInBytes; }