/// <summary cref="KernelAccelerator{TCompiledKernel, TKernel} /// .GenerateKernelLauncherMethod(TCompiledKernel, int)"/> protected override MethodInfo GenerateKernelLauncherMethod( CLCompiledKernel kernel, int customGroupSize) { var entryPoint = kernel.EntryPoint; AdjustAndVerifyKernelGroupSize(ref customGroupSize, entryPoint); // Add support for by ref parameters if (entryPoint.HasByRefParameters) { throw new NotSupportedException( ErrorMessages.NotSupportedByRefKernelParameters); } var launcher = entryPoint.CreateLauncherMethod(Context); var emitter = new ILEmitter(launcher.ILGenerator); // Load kernel instance var kernelLocal = emitter.DeclareLocal(typeof(CLKernel)); KernelLauncherBuilder.EmitLoadKernelArgument <CLKernel, ILEmitter>( Kernel.KernelInstanceParamIdx, emitter); emitter.Emit(LocalOperation.Store, kernelLocal); // Map all kernel arguments var argumentMapper = Backend.ArgumentMapper; argumentMapper.Map(emitter, kernelLocal, entryPoint); // Load stream KernelLauncherBuilder.EmitLoadAcceleratorStream <CLStream, ILEmitter>( Kernel.KernelStreamParamIdx, emitter); // Load kernel emitter.Emit(LocalOperation.Load, kernelLocal); // Load dimensions KernelLauncherBuilder.EmitLoadRuntimeKernelConfig( entryPoint, emitter, Kernel.KernelParamDimensionIdx, customGroupSize); // Dispatch kernel emitter.EmitCall(LaunchKernelMethod); // Emit ThrowIfFailed emitter.EmitCall(ThrowIfFailedMethod); emitter.Emit(OpCodes.Ret); emitter.Finish(); return(launcher.Finish()); }
/// <summary cref="KernelAccelerator{TCompiledKernel, TKernel} /// .GenerateKernelLauncherMethod(TCompiledKernel, int)"/> protected override MethodInfo GenerateKernelLauncherMethod( CLCompiledKernel kernel, int customGroupSize) { var entryPoint = kernel.EntryPoint; AdjustAndVerifyKernelGroupSize(ref customGroupSize, entryPoint); // Add support for by ref parameters if (entryPoint.HasByRefParameters) { throw new NotSupportedException( ErrorMessages.NotSupportedByRefKernelParameters); } using var scopedLock = entryPoint.CreateLauncherMethod( Context.RuntimeSystem, out var launcher); var emitter = new ILEmitter(launcher.ILGenerator); // Load kernel instance var kernelLocal = emitter.DeclareLocal(typeof(CLKernel)); KernelLauncherBuilder.EmitLoadKernelArgument <CLKernel, ILEmitter>( Kernel.KernelInstanceParamIdx, emitter); emitter.Emit(LocalOperation.Store, kernelLocal); // Map all kernel arguments var argumentMapper = Backend.ArgumentMapper; argumentMapper.Map( emitter, kernelLocal, Context.TypeContext, entryPoint); // Load current driver API emitter.EmitCall(GetCLAPIMethod); // Load stream KernelLauncherBuilder.EmitLoadAcceleratorStream <CLStream, ILEmitter>( Kernel.KernelStreamParamIdx, emitter); // Load kernel emitter.Emit(LocalOperation.Load, kernelLocal); // Load dimensions KernelLauncherBuilder.EmitLoadRuntimeKernelConfig( entryPoint, emitter, Kernel.KernelParamDimensionIdx, MaxGridSize, MaxGroupSize, customGroupSize); // Dispatch kernel var launchMethod = GenericLaunchKernelMethod.MakeGenericMethod( entryPoint.SharedMemory.HasDynamicMemory ? typeof(DynamicSharedMemoryHandler) : typeof(DefaultLaunchHandler)); emitter.EmitCall(launchMethod); // Emit ThrowIfFailed emitter.EmitCall(ThrowIfFailedMethod); emitter.Emit(OpCodes.Ret); emitter.Finish(); return(launcher.Finish()); }