/// <summary> /// Pins pointers to underlying matrix arrays and stores them for later use. /// The order of matrices is preserved. /// </summary> /// <remarks> /// When <see cref="rowMajor"/> is set, arrays are decoupled from original matrices. /// Changes made to arrays will be synchronized only upon <see cref="Dispose"/>. /// </remarks> /// <param name="rowMajor"> /// Indicates whether matrices should be converted to row-major format. /// </param> /// <param name="generateDefinitions">Whether to generate matrix definitions for GPU transfer.</param> /// <param name="matrices">Matrices to pin pointers to.</param> public MatrixPointersBag(bool rowMajor, bool generateDefinitions, params Matrix <T>[] matrices) { _rowMajor = rowMajor; _arrayMap = rowMajor ? new List <Tuple <Matrix <T>, T[]> >() : null; _defs = generateDefinitions ? new MatrixDefinition[matrices.Length] : null; _disposed = false; _handles = new GCHandle[matrices.Length]; _pointers = new IntPtr[matrices.Length]; for (int i = 0; i < matrices.Length; i++) { var matrix = matrices[i]; T[] array; if (rowMajor) { array = matrix.ToRowMajorArray(); _arrayMap.Add(new Tuple <Matrix <T>, T[]>(matrix, array)); } else { array = matrix.AsColumnMajorArray(); } _handles[i] = GCHandle.Alloc(array, GCHandleType.Pinned); var ptr = _handles[i].AddrOfPinnedObject(); _pointers[i] = ptr; if (generateDefinitions) { _defs[i] = new MatrixDefinition(matrix.RowCount, matrix.ColumnCount, 1, ptr); } } }
public override void TestClampMatrix(MatrixDefinition matrix, float threshold) { Testing.TestClampMatrixGpu(matrix, threshold); }
public override void TestMatrixTransfer(MatrixDefinition matrix) { Testing.TestMatrixTransferGpu(matrix); }
public override void TestCrossEntropyBackprop(MatrixDefinition m1, MatrixDefinition m2, MatrixDefinition result) { Testing.TestCrossEntropyBackpropGpu(m1, m2, result); }
public override void TestRMSPropUpdate(MatrixDefinition weight, MatrixDefinition grad, MatrixDefinition cache1, MatrixDefinition cache2, MatrixDefinition cacheM, float learningRate, float decayRate, float momentum, float weightDecay) { Testing.TestRMSPropUpdateGpu(weight, grad, cache1, cache2, cacheM, learningRate, decayRate, momentum, weightDecay); }
public abstract void TestMatrixTransferRowMajor(MatrixDefinition matrix);
public override double TestCrossEntropyError(MatrixDefinition m1, MatrixDefinition m2) { return(Testing.TestCrossEntropyErrorGpu(m1, m2)); }
public static extern void TestMatrixTransferRowMajorGpu(MatrixDefinition matrix);
public abstract void TestClampMatrix(MatrixDefinition matrix, float threshold);
public static extern void TestRMSPropUpdateGpu(MatrixDefinition weight, MatrixDefinition grad, MatrixDefinition cache1, MatrixDefinition cache2, MatrixDefinition cacheM, float learningRate, float decayRate, float momentum, float weightDecay);
public static extern void TestClampMatrixGpu(MatrixDefinition matrix, float threshold);
public static extern void TestCrossEntropyBackpropGpu(MatrixDefinition m1, MatrixDefinition m2, MatrixDefinition result);
public abstract void TestRMSPropUpdate(MatrixDefinition weight, MatrixDefinition grad, MatrixDefinition cache1, MatrixDefinition cache2, MatrixDefinition cacheM, float learningRate, float decayRate, float momentum, float weightDecay);
public static extern double TestCrossEntropyErrorGpu(MatrixDefinition m1, MatrixDefinition m2);
public abstract void TestCrossEntropyBackprop(MatrixDefinition m1, MatrixDefinition m2, MatrixDefinition result);
public abstract double TestCrossEntropyError(MatrixDefinition m1, MatrixDefinition m2);