コード例 #1
0
ファイル: CodeGeneration.cs プロジェクト: irpbc/mj
        private void makeObjectFile()
        {
            LLVM.InitializeX86TargetMC();
            LLVM.InitializeX86Target();
            LLVM.InitializeX86TargetInfo();
            LLVM.InitializeX86AsmParser();
            LLVM.InitializeX86AsmPrinter();

            LLVMTargetRef target = LLVM.GetFirstTarget();

            if (target.Pointer == IntPtr.Zero)
            {
                return;
            }

            string triple = getTargetTriple();

            LLVMTargetMachineRef targetMachine = LLVM.CreateTargetMachine(target, triple, "generic", "",
                                                                          LLVMCodeGenOptLevel.LLVMCodeGenLevelDefault, LLVMRelocMode.LLVMRelocDefault,
                                                                          LLVMCodeModel.LLVMCodeModelDefault);

#if EMIT_TO_FILE
            string message;
            unsafe
            {
                fixed(char *fileName = options.OutPath)
                {
                    LLVM.TargetMachineEmitToFile(targetMachine, module, new IntPtr(fileName),
                                                 LLVMCodeGenFileType.LLVMObjectFile, out message);
                    LLVM.DisposeTargetMachine(targetMachine);
                }
            }
            if (!String.IsNullOrEmpty(message))
            {
                log.globalError("Failed to emit object file. LLVM Error: {0}", message);
            }
#else
            LLVM.TargetMachineEmitToMemoryBuffer(targetMachine, module, LLVMCodeGenFileType.LLVMObjectFile,
                                                 out var _, out var memoryBuffer);

            size_t bufferSize  = LLVM.GetBufferSize(memoryBuffer);
            IntPtr bufferStart = LLVM.GetBufferStart(memoryBuffer);

            unsafe {
                Stream   s    = new UnmanagedMemoryStream((byte *)bufferStart.ToPointer(), bufferSize);
                FileInfo file = new FileInfo(options.OutPath);
                if (file.Exists)
                {
                    file.Delete();
                }

                using (FileStream fs = file.Open(FileMode.Create, FileAccess.Write))
                    using (DisposableBuffer unused = new DisposableBuffer(memoryBuffer)) {
                        s.CopyTo(fs);
                    }
            }
#endif
        }
コード例 #2
0
    void Start()
    {
        var count = 1 << powOfSize;

        Debug.LogFormat("Count={0}", count);

        _sort   = new BitonicMergeSort(compute);
        _keys   = new DisposableBuffer <uint>(count);
        _values = new DisposableBuffer <int>(count);

        Random.seed = seed;
        var data = new int[count];

        for (var i = 0; i < count; i++)
        {
            data[i] = i;
        }
        for (var i = 0; i < count; i++)
        {
            var j   = Random.Range(0, count);
            var k   = Random.Range(0, count);
            var tmp = data[j]; data[j] = data[k]; data[k] = tmp;
        }
        System.Array.Copy(data, _values.Data, count);
        _values.Upload();

        _sort.Init(_keys.Buffer);
        _sort.SortInt(_keys.Buffer, _values.Buffer);

        _keys.Download();
        var failed = false;

        for (var i = 0; i < count; i++)
        {
            var j = _values.Data[_keys.Data[i]];
            if (j != i)
            {
                failed = true;
                Debug.LogErrorFormat("Unexpected Key {0} at {1}", j, i);
            }
        }
        Debug.LogFormat("Sort Test Result = {0}", (failed ? "Wrong" : "Correct"));
    }
コード例 #3
0
        public void GPUReduction()
        {
            var redwidth  = 4;
            var redheight = 4;
            var redinput  = new Vector4[redwidth * redheight];

            using (var redbuf = new DisposableBuffer(redinput.Length, Marshal.SizeOf(redinput[0]))) {
                for (var x = 0; x < redwidth; x++)
                {
                    for (var y = 0; y < redheight; y++)
                    {
                        var v = Vector4.zero;
                        v[x] = (y <= x ? 1f : 0f);
                        redinput[x + y * redwidth] = v;
                    }
                }
                redbuf.Buffer.SetData(redinput);

                var red   = new GPUReduction();
                var accum = red.Accumulate4(redbuf, redwidth, redheight);
                AreApproximatelyEqual(new Vector4(1, 2, 3, 4), accum);
            }
        }