From 5c2ffab0f93922cb93b06d3ee25eaf7129211ff5 Mon Sep 17 00:00:00 2001 From: Grigory Chudov Date: Wed, 26 Jun 2013 00:54:53 -0400 Subject: [PATCH] FLACCL: Display platform and device used --- CUETools.Codecs.FLACCL/FLACCLWriter.cs | 61 ++++++++++++++++-------- CUETools.FLACCL.cmd/Program.cs | 65 ++++++++++++++------------ 2 files changed, 77 insertions(+), 49 deletions(-) diff --git a/CUETools.Codecs.FLACCL/FLACCLWriter.cs b/CUETools.Codecs.FLACCL/FLACCLWriter.cs index 8d29602..7aea4fd 100644 --- a/CUETools.Codecs.FLACCL/FLACCLWriter.cs +++ b/CUETools.Codecs.FLACCL/FLACCLWriter.cs @@ -33,6 +33,9 @@ namespace CUETools.Codecs.FLACCL { public class FLACCLWriterSettings : AudioEncoderSettings { + internal IntPtr m_platform = IntPtr.Zero; + internal IntPtr m_device = IntPtr.Zero; + public FLACCLWriterSettings() : base() { @@ -61,6 +64,37 @@ namespace CUETools.Codecs.FLACCL { if (EncoderModeIndex < 0) throw new Exception("unsupported encoder mode"); + if (OpenCL.NumberOfPlatforms < 1) + throw new Exception("no opencl platforms found"); + if (Platform == null) + m_platform = OpenCL.GetPlatform(0).PlatformID; + else + { + for (int i = 0; i < OpenCL.NumberOfPlatforms; i++) + { + var platform = OpenCL.GetPlatform(i); + if (platform.Name.Equals(Platform, StringComparison.InvariantCultureIgnoreCase)) + { + m_platform = platform.PlatformID; + break; + } + } + if (m_platform == IntPtr.Zero) + throw new Exception("unknown platform \"" + Platform + "\". Platforms available:" + + string.Join(", ", (new List(OpenCL.GetPlatforms())).ConvertAll(p => "\"" + p.Name + "\"").ToArray())); + } + Platform = OpenCL.GetPlatform(m_platform).Name; + { + //var device = OpenCL.GetPlatform(m_platform).GetDevice(OpenCL.GetPlatform(m_platform).QueryDeviceIntPtr()[0]); + var devices = new List(OpenCL.GetPlatform(m_platform).QueryDevices((DeviceType)DeviceType)); + var RequireImageSupport = true; + var RequiredExtensions = new List(); + devices.RemoveAll(d => (d.ImageSupport != true && RequireImageSupport) || !d.HasExtensions(RequiredExtensions.ToArray())); + if (devices.Count == 0) + throw new Exception("no OpenCL devices found that matched filter criteria"); + m_device = devices[0].DeviceID; + Device = devices[0].Name; + } SetDefaultValuesForMode(); if (Padding < 0) throw new Exception("unsupported padding value " + Padding.ToString()); @@ -166,6 +200,11 @@ namespace CUETools.Codecs.FLACCL [SRDescription(typeof(Properties.Resources), "DescriptionDeviceType")] public OpenCLDeviceType DeviceType { get; set; } + //[TypeConverter(typeof(FLACCLWriterSettingsDeviceConverter))] + [SRDescription(typeof(Properties.Resources), "DescriptionDevice")] + [Browsable(false)] + public string Device { get; set; } + [DefaultValue(0)] [SRDescription(typeof(Properties.Resources), "DescriptionCPUThreads")] public int CPUThreads { get; set; } @@ -1717,25 +1756,7 @@ namespace CUETools.Codecs.FLACCL OCLMan.BuildOptions = ""; OCLMan.SourcePath = System.IO.Path.GetDirectoryName(GetType().Assembly.Location); OCLMan.BinaryPath = System.IO.Path.Combine(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CUE Tools"), "OpenCL"); - int platformId = 0; - if (m_settings.Platform != null) - { - platformId = -1; - string platforms = ""; - for (int i = 0; i < OpenCL.NumberOfPlatforms; i++) - { - var platform = OpenCL.GetPlatform(i); - platforms += " \"" + platform.Name + "\""; - if (platform.Name.Equals(m_settings.Platform, StringComparison.InvariantCultureIgnoreCase)) - { - platformId = i; - break; - } - } - if (platformId < 0) - throw new Exception("unknown platform \"" + m_settings.Platform + "\". Platforms available:" + platforms); - } - OCLMan.CreateDefaultContext(platformId, (DeviceType)m_settings.DeviceType); + OCLMan.CreateContext(OpenCL.GetPlatform(m_settings.m_platform).GetDevice(m_settings.m_device)); this.framesPerTask = (int)OCLMan.Context.Devices[0].MaxComputeUnits * Math.Max(1, m_settings.TaskSize / channels); @@ -1763,7 +1784,7 @@ namespace CUETools.Codecs.FLACCL "#define DEBUG\n" + #endif (m_settings.DeviceType == OpenCLDeviceType.CPU ? "#define FLACCL_CPU\n" : "") + - "#define OPENCL_PLATFORM \"" + OpenCL.GetPlatform(platformId).Name + "\"\n" + + "#define OPENCL_PLATFORM \"" + OpenCL.GetPlatform(m_settings.m_platform).Name + "\"\n" + "#define VENDOR_ID " + OCLMan.Context.Devices[0].VendorID + "\n" + m_settings.Defines + "\n"; diff --git a/CUETools.FLACCL.cmd/Program.cs b/CUETools.FLACCL.cmd/Program.cs index 3ffab4e..691edcd 100644 --- a/CUETools.FLACCL.cmd/Program.cs +++ b/CUETools.FLACCL.cmd/Program.cs @@ -35,37 +35,40 @@ namespace CUETools.FLACCL.cmd Console.WriteLine(); Console.WriteLine("Options:"); Console.WriteLine(); - Console.WriteLine(" -0 .. -11 Compression level, default 8; 9..11 require --lax"); - Console.WriteLine(" -o Output filename, or \"-\" for stdout, or nul"); - Console.WriteLine(" -p # Padding bytes"); - Console.WriteLine(" -q --quiet Quiet mode"); - Console.WriteLine(" --lax Allow non-subset modes"); - Console.WriteLine(" --verify Verify during encoding"); - Console.WriteLine(" --no-md5 Don't compute MD5 hash"); - Console.WriteLine(" --no-seektable Don't generate a seektable"); - Console.WriteLine(" --cpu-threads Use additional CPU threads"); + Console.WriteLine(" -0 .. -11 Compression level, default 8; 9..11 require --lax"); + Console.WriteLine(" -o Output filename, or \"-\" for stdout, or nul"); + Console.WriteLine(" -p # Padding bytes"); + Console.WriteLine(" -q --quiet Quiet mode"); + Console.WriteLine(" --lax Allow non-subset modes"); + Console.WriteLine(" --verify Verify during encoding"); + Console.WriteLine(" --no-md5 Don't compute MD5 hash"); + Console.WriteLine(" --no-seektable Don't generate a seektable"); + Console.WriteLine(" --cpu-threads Use additional CPU threads"); Console.WriteLine(); Console.WriteLine("OpenCL Options:"); Console.WriteLine(); - Console.WriteLine(" --opencl-type CPU or GPU, default GPU"); - Console.WriteLine(" --opencl-platform \"ATI Stream\", \"NVIDIA CUDA\", \"Intel(R) OpenCL\" etc"); - Console.WriteLine(" --group-size # Set GPU workgroup size (64,128,256)"); - Console.WriteLine(" --task-size # Set number of frames per multiprocessor, default 8"); - Console.WriteLine(" --slow-gpu Some encoding stages are done on CPU"); - Console.WriteLine(" --fast-gpu Experimental mode, not recommended"); - Console.WriteLine(" --define OpenCL preprocessor definition"); + Console.WriteLine(" --opencl-type CPU or GPU, default GPU"); + var platforms = new List(); + foreach (var value in (new FLACCLWriterSettingsPlatformConverter()).GetStandardValues(null)) + platforms.Add(value as string); + Console.WriteLine(" --opencl-platform {0}", platforms.Count == 0 ? "No OpenCL platforms detected" : string.Join(", ", platforms.ConvertAll(s => "\"" + s + "\"").ToArray())); + Console.WriteLine(" --group-size # Set GPU workgroup size (64,128,256)"); + Console.WriteLine(" --task-size # Set number of frames per multiprocessor, default 8"); + Console.WriteLine(" --slow-gpu Some encoding stages are done on CPU"); + Console.WriteLine(" --fast-gpu Experimental mode, not recommended"); + Console.WriteLine(" --define OpenCL preprocessor definition"); Console.WriteLine(); Console.WriteLine("Advanced Options:"); Console.WriteLine(); - Console.WriteLine(" -b # Block size"); - Console.WriteLine(" -s Stereo decorrelation (independent,search)"); - Console.WriteLine(" -r #[,#] Rice partition order {max} or {min},{max} (0..8)"); + Console.WriteLine(" -b # Block size"); + Console.WriteLine(" -s Stereo decorrelation (independent,search)"); + Console.WriteLine(" -r #[,#] Rice partition order {max} or {min},{max} (0..8)"); Console.WriteLine(); Console.WriteLine("LPC options:"); Console.WriteLine(); - Console.WriteLine(" -w [,] Window functions (bartlett,welch,hann,flattop,tukey)"); - Console.WriteLine(" -l #[,#] Prediction order {max} or {min},{max} (1..32)"); - Console.WriteLine(" --max-precision Coefficients precision search (0..1)"); + Console.WriteLine(" -w [,] Window functions (bartlett,welch,hann,flattop,tukey)"); + Console.WriteLine(" -l #[,#] Prediction order {max} or {min},{max} (1..32)"); + Console.WriteLine(" --max-precision Coefficients precision search (0..1)"); Console.WriteLine(); } @@ -225,10 +228,9 @@ namespace CUETools.FLACCL.cmd if (((input_file == "-" || Path.GetExtension(input_file) == ".flac") && output_file == null)) { - Console.WriteLine(); + Usage(); + Console.WriteLine(); Console.WriteLine("Output file not specified."); - Console.WriteLine(); - Usage(); return 2; } @@ -245,7 +247,9 @@ namespace CUETools.FLACCL.cmd audioSource = new FlakeReader(input_file, null); else { - Usage(); + Usage(); + Console.WriteLine(); + Console.WriteLine("Input file \"{0}\" does not exist.", input_file); return 2; } } @@ -272,6 +276,7 @@ namespace CUETools.FLACCL.cmd output_file == "-" ? Console.OpenStandardOutput() : output_file == "nul" ? new NullStream() : null, settings); + settings = encoder.Settings as FLACCLWriterSettings; encoder.FinalSampleCount = audioSource.Length; if (stereo_method != null) encoder.StereoMethod = Flake.LookupStereoMethod(stereo_method); @@ -306,7 +311,9 @@ namespace CUETools.FLACCL.cmd { Console.WriteLine("Filename : {0}", input_file); Console.WriteLine("File Info : {0}kHz; {1} channel; {2} bit; {3}", audioSource.PCM.SampleRate, audioSource.PCM.ChannelCount, audioSource.PCM.BitsPerSample, TimeSpan.FromSeconds(audioSource.Length * 1.0 / audioSource.PCM.SampleRate)); - } + Console.WriteLine("Platform : {0}", settings.Platform); + Console.WriteLine("Device : {0}", settings.Device); + } bool keepRunning = true; Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs e) @@ -394,12 +401,12 @@ namespace CUETools.FLACCL.cmd settings.MaxPartitionOrder, settings.GPUOnly ? "GPU" : "CPU", encoder.OrdersPerWindow, - (encoder.Settings as FLACCLWriterSettings).MaxLPCOrder, + settings.MaxLPCOrder, encoder.MinPrecisionSearch, encoder.MaxPrecisionSearch, encoder.Settings.BlockSize, encoder.VBRMode, - (encoder.Settings as FLACCLWriterSettings).MaxFixedOrder - (encoder.Settings as FLACCLWriterSettings).MinFixedOrder + 1, + settings.MaxFixedOrder - settings.MinFixedOrder + 1, encoder.DoConstant ? "c" : "" ); }