コード例 #1
0
ファイル: KalkNativeBuffer.cs プロジェクト: xoofx/kalk
 public KalkNativeBuffer(byte[] buffer)
 {
     _buffer = new SharedBuffer(buffer.Length);
     buffer.CopyTo(_buffer.AsSpan());
     _offset = 0;
     _length = _buffer.Length;
 }
コード例 #2
0
 void ISender.Send(SharedBuffer buffer, ApiStatus status)
 {
     if (this.Send != null)
     {
         this.Send(buffer, status);
     }
 }
コード例 #3
0
        public static SharedBuffer CreateBuffer(Guid id, Type elementType, long bufferSize)
        {
            var sb = new SharedBuffer();

            sb.Id = id;
            sb.ElementTypeString = elementType.FullName;
            sb.ElementSize       = Marshal.SizeOf(elementType);
            sb.ElementCount      = bufferSize;

            if (_blockPath != string.Empty)
            {
                var fileStream = System.IO.File.Create(string.Format(@"{0}\{1}", _blockPath, id.ToString()),
                                                       (int)(bufferSize * sb.ElementSize), System.IO.FileOptions.DeleteOnClose);

                var mmf = MemoryMappedFile.CreateFromFile(fileStream, id.ToString(),
                                                          (int)(bufferSize * sb.ElementSize),
                                                          MemoryMappedFileAccess.ReadWrite, null, System.IO.HandleInheritability.None, false);

                _cacheBuffers.TryAdd(id, sb);
                _cacheMmfs.TryAdd(id, mmf);
                _cacheFileStreams.TryAdd(id, fileStream);
            }
            else
            {
                var mmf = MemoryMappedFile.CreateNew(id.ToString(),
                                                     bufferSize * sb.ElementSize);
                _cacheBuffers.TryAdd(id, sb);
                _cacheMmfs.TryAdd(id, mmf);
            }

            return(sb);
        }
コード例 #4
0
        protected override Task SendAsync(SharedBuffer buffer)
        {
            if (this.Send != null)
            {
                return(this.Send(buffer, this.RaiseBackgroundError));
            }

            return(Task.CompletedTask);
        }
コード例 #5
0
ファイル: KalkNativeBuffer.cs プロジェクト: xoofx/kalk
        public KalkNativeBuffer(IEnumerable <byte> buffer)
        {
            var array = new List <byte>(buffer).ToArray();;

            _buffer = new SharedBuffer(array.Length);
            array.CopyTo(_buffer.AsSpan());
            _offset = 0;
            _length = _buffer.Length;
        }
コード例 #6
0
ファイル: KalkNativeBuffer.cs プロジェクト: xoofx/kalk
 public KalkNativeBuffer(int size)
 {
     if (size < 0)
     {
         throw new ArgumentOutOfRangeException(nameof(size));
     }
     _buffer = new SharedBuffer(size);
     _offset = 0;
     _length = size;
 }
コード例 #7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sb"></param>
        public void PrefetchBuffer(SharedBuffer sb)
        {
            if ((!_sbStack.Any(sbOther => sbOther.Id.CompareTo(sb.Id) == 0)) &&
                (!_sbDone.Any(sbOther => sbOther.Id.CompareTo(sb.Id) == 0)))
            {
                _sbStack.Push(sb);
            }

            if (_sbPrefetchTask == null ||
                _sbPrefetchTask.Status != System.Threading.Tasks.TaskStatus.Running)
            {
                Action prefetchAction = () =>
                {
                    try
                    {
                        while (true)
                        {
                            SharedBuffer sbLocal;
                            if (_sbStack.TryPop(out sbLocal))
                            {
#if SLOW_POKE
                                var        handle    = sbLocal.GetHandle();
                                const long STEP_SIZE = 4096;
                                long       numSteps  = (long)handle.ByteLength / STEP_SIZE;
                                System.Threading.Tasks.Parallel.For(0, numSteps,
                                                                    at => handle.Read <byte>((ulong)(at * STEP_SIZE)));
                                sbLocal.ReleaseHandle();
#else
                                BufferRepository.ReadFile(sbLocal.Id);
#endif
                                _sbDone.Add(sbLocal);
                            }
                            else
                            {
                                System.Threading.Thread.Sleep(1000);
                            }
                        }
                    }
                    finally
                    {
                        System.Console.WriteLine("Exiting prefetch...");
                    }
                };

                _sbPrefetchTask = new System.Threading.Tasks.Task(prefetchAction);
                _sbPrefetchTask.Start();
            }
        }
コード例 #8
0
        private static int InvokeSend(IntPtr managed_handle, IntPtr buffer, IntPtr status)
        {
            return(SenderAdapter.InvokeAndUnwrapExceptions(
                       (ApiStatus apiStatus) =>
            {
                SenderAdapter adapter = GetAdapterOrThrow(managed_handle);
                SharedBuffer sharedBuffer = new SharedBuffer(buffer);

                // Buffer must live at least as long as the underlying call.
                unsafe {
                    adapter.senderImplementation.Send(sharedBuffer, apiStatus);
                }

                return apiStatus.ErrorCode;
            },
                       status
                       ));
        }
コード例 #9
0
        public override void Init()
        {
            base.Init();

            GenerateQuad();

            var shader = Resources.Load <Shader>("shaders/raytracing.shader");

            storageTex    = Texture.CreateStorage(2048, 2048, VkFormat.R8G8B8A8SNorm);
            uniformBuffer = new SharedBuffer(VkBufferUsageFlags.UniformBuffer, (uint)Utilities.SizeOf <UboCompute>());

            material = new Material(shader);
            material.SetTexture("samplerColor", storageTex);

            computePipeline    = shader.GetPass("Compute");
            computeResourceSet = new DescriptorSet(computePipeline.PipelineLayout.ResourceLayout[0], storageTex, uniformBuffer);

            renderer.AddComputePass(Docompute);
            renderer.AddGraphicsPass(DrawQuad);

            MainView.Attach(null, null, renderer);
        }
コード例 #10
0
ファイル: Share.cs プロジェクト: AdroDG/babble-cs
 public ShareEnumerator(SharedBuffer <T> parent)
 {
     _parent = parent;
 }
コード例 #11
0
ファイル: KalkNativeBuffer.cs プロジェクト: xoofx/kalk
 private KalkNativeBuffer(SharedBuffer buffer, int offset, int length)
 {
     _buffer = buffer;
     _offset = offset;
     _length = length;
 }
コード例 #12
0
ファイル: Share.cs プロジェクト: zyj10053/reactive
 public ShareEnumerator(SharedBuffer <T> parent)
 {
     _parent = parent;
     Current = default !;
コード例 #13
0
        public void TestSum()
        {
            int[] numbers = Enumerable.Range(999, 10000).ToArray();
            using (CudaManager cudaManager = Provider.CudaManagerPool.GetCudaManagerForThread(Provider.Logger))
                using (CudaArray <int> numbersBuffer = numbers)
                    using (CudaArray <int> outputBuffer = new[] { 0 }) {
                        KernelManager kernels = new KernelManager(cudaManager);

                        for (int nBlocks = 1; nBlocks <= 1024; nBlocks *= 2)
                        {
                            for (int threadsPerBlock = 1; threadsPerBlock <= 1024; threadsPerBlock *= 2)
                            {
                                kernels["setIntKernel"].Arguments(outputBuffer, 0).ExecuteTask();
                                Assert.AreEqual(0, outputBuffer.Read()[0]);
                                kernels["sumToOutputKernel"].Arguments(numbersBuffer, numbers.Length, outputBuffer, SharedBuffer.Ints(threadsPerBlock)).Execute(nBlocks * threadsPerBlock, threadsPerBlock);
                                Assert.AreEqual(numbers.Sum(), outputBuffer.Read()[0]);
                            }
                        }
                    }
        }