Exemple #1
0
 public override void VisitLeaf(ITreeValueNode node)
 {
     if (!TreeNodeIsDimensionVariable(node))
     {
         base.VisitLeaf(node);
         return;
     }
     else
     {
         (ITreeValueNode parent, int dim) = GetDimensionVariableParent(node);
         if (Tree.InputVariableNodes.Contains(parent))
         {
             base.VisitLeaf(node);
             return;
         }
         else
         {
             ITermShape parentShape           = parent.ValueAs <ITermShape>();
             ITermShape substituteParentShape =
                 InputShapes.FirstOrDefault(s => s.Dimensions.SequenceEqual(parentShape.Dimensions));
             if (substituteParentShape == null)
             {
                 throw new TileGeneratorException(this, "Could not find input variable node to substitute for "
                                                  + $"{parentShape.Label}.");
             }
             else
             {
                 Context.Push(substituteParentShape.Label.ToUpper() + "DIM" + dim.ToString());
             }
         }
     }
 }
Exemple #2
0
        public bool Compile <TKernel>(IEnumerable <ITermShape> inputShapes, ITermShape outputShape, string code,
                                      out IRunnable <TKernel> result)
            where TKernel : unmanaged, IEquatable <TKernel>, IComparable <TKernel>, IConvertible
        {
            result = null;
            ThrowIfNotInitialized();
            Status = CompilerStatus.Compiling;
            var f = CreateFunction(code);

            if (!f.IsAllocated)
            {
                CompilerStatusMessage = f.LastStatusString;
                return(false);
            }

            var inputTensors = inputShapes
                               .Select(i => CreateTensor(CreateShape <TKernel>(i.Dimensions), i.Label.ToUpper()))
                               .ToArray();
            var outputTensor = CreateTensor(CreateShape <TKernel>(outputShape.Dimensions),
                                            outputShape.Label.ToUpper());

            var invoker = new Invoker <TKernel>(Context, f, outputTensor, inputTensors);

            if (!(invoker.IsAllocated && invoker.AllVariablesSet))
            {
                CompilerStatusMessage = invoker.LastStatusString;
                return(false);
            }

            result = invoker;
            return(true);
        }
Exemple #3
0
        public bool Compile <TVectorKernel>(int vectorCount, int vectorLength, string code,
                                            out IRunnable <TVectorKernel> result)
            where TVectorKernel : unmanaged, IEquatable <TVectorKernel>, IComparable <TVectorKernel>, IConvertible
        {
            var inputs = new ITermShape[vectorCount];

            for (int i = 0; i < inputs.Length; i++)
            {
                inputs[i] = new DeviceTensor(OpenFirstDevice(), CreateShape <TVectorKernel>(vectorLength),
                                             "I" + i);
            }

            ITermShape output = new DeviceTensor(OpenFirstDevice(), CreateShape <TVectorKernel>(vectorLength), "O");

            return(Compile(inputs, output, code, out result));
        }
Exemple #4
0
 public bool Compile <TKernel>(ITermShape inputShape, ITermShape outputShape, string code,
                               out IRunnable <TKernel> result)
     where TKernel : unmanaged, IEquatable <TKernel>, IComparable <TKernel>, IConvertible
 => Compile(new ITermShape[] { inputShape }, outputShape, code, out result);