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 }
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")); }
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); } }