Undocumented Matlab
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT
  • SERVICES
    • Consulting
    • Development
    • Training
    • Gallery
    • Testimonials
  • PRODUCTS
    • IQML: IQFeed-Matlab connector
    • IB-Matlab: InteractiveBrokers-Matlab connector
    • EODML: EODHistoricalData-Matlab connector
    • Webinars
  • BOOKS
    • Secrets of MATLAB-Java Programming
    • Accelerating MATLAB Performance
    • MATLAB Succinctly
  • ARTICLES
  • ABOUT
    • Policies
  • CONTACT

Explicit multi-threading in Matlab part 2

February 26, 2014 No Comments

Last week, I explained how we can start asynchronous Java threads to run in parallel to the main Matlab processing. Today I continue the series by examining .Net threads. Next week I will discuss C++ threads, followed by a final article on timers and process-spawning.
I continue using last week’s example, where we compute some data, save it to file on a relatively slow USB/network disk, and then proceed with another calculation. The purpose of multi-threading would be to offload the I/O onto a separate thread, so that the Matlab computation can continue in parallel without needing to wait for the slow I/O.
Dot-Net (.Net), like Java and C++, also enables multithreading. .Net libraries (assemblies) are commonly distributed as DLL files, which can be loaded into Matlab using the NET.addAssembly function, similarly to the javaaddpath function for Java classes. Using these assemblies in Matlab is then as straight-forward as in Java:

NET.addAssembly('C:\Yair\Code\NetThread.dll');
data = rand(5e6,1);  % pre-processing (5M elements, ~40MB)
start(My.NetThread('F:\test.data',data));  % start running in parallel
data = fft(data);  % post-processing (.Net I/O runs in parallel)

NET.addAssembly('C:\Yair\Code\NetThread.dll'); data = rand(5e6,1); % pre-processing (5M elements, ~40MB) start(My.NetThread('F:\test.data',data)); % start running in parallel data = fft(data); % post-processing (.Net I/O runs in parallel)


As with Java, the assembly only needs to be loaded once per Matlab session, not repeatedly. The definition of the .Net class closely follows that of the Java class. Unfortunately, .Net’s System.Threading.Thread class is sealed (non-inheritable), so we cannot extend it as we did in Java. However, we can instantiate an internal Thread object within our class and use it. Here is the corresponding C# source code (thanks to Ronnie Shmuel who assisted):

using System;
using System.IO;
using System.Threading;
namespace My
{
    public class NetThread
    {
        string filename;
        double[] doubleData;
        Thread thread;
        public NetThread(string filename, double[] data)
        {
            this.filename = filename;
            this.doubleData = data;
            thread = new Thread(this.run);
        }
        public void start()
        {
            thread.Start();  // note the capital S in Start()
        }
        private void run()
        {
            try
            {
                BinaryWriter out = new BinaryWriter(
                                   File.Open(filename,FileMode.Create))
                for (int i = 0; i < doubleData.Length; i++)
                {
                    out.Write(doubleData[i]);
                }
                out.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

using System; using System.IO; using System.Threading; namespace My { public class NetThread { string filename; double[] doubleData; Thread thread; public NetThread(string filename, double[] data) { this.filename = filename; this.doubleData = data; thread = new Thread(this.run); } public void start() { thread.Start(); // note the capital S in Start() } private void run() { try { BinaryWriter out = new BinaryWriter( File.Open(filename,FileMode.Create)) for (int i = 0; i < doubleData.Length; i++) { out.Write(doubleData[i]); } out.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } }

Note that C# Thread uses the Start() method (uppercase S), unlike java.lang.Thread that uses start() (lowercase s). Also, while java.lang.Thread.start() always invokes a run() method (the “run” name is predefined), C# Thread.Start() can invoke any delegate method. In this example I chose to name it run() for consistency with the Java example, but in fact I could have named it anything else.
In this example I’ve used C# source code, but in fact I could also use C++, F# or VB code, since the System.Threading.Thread class behaves very similarly in all of them. Once we compile it in our favorite compiler [hmmm, Microsoft Visual Studio anyway…], the resulting .Net assembly aught to work exactly the same in Matlab.

Compatibility and synchronization

Unlike Java and C++, .Net is not platform-independent: it only works on Windows, so if we need a cross-platform solution then we need to use Java or one of the other alternatives.
Also note that the .Net solution will only work on platforms that installed .Net of a supporting .Net version (Framework). .Net is commonly installed on Win7+, but not for example on XP. On Windows platforms where .Net is not installed, we need to download and install it before we can use any .Net features (duh!). To ensure .NET is supported on our current platform, use the NET.isNETSupported function:

>> NET.isNETSupported  % returns true/false
ans =
     1

>> NET.isNETSupported % returns true/false ans = 1

As with Java, when compiling a .Net class that should be used within Matlab, we must ensure that we are compiling for a .Net Framework that is equal to or lower than what Matlab will actually use in the target platform, as reported by System.Environment.Version:

% My system uses .Net 4.0, so we should compile for .Net 4.0, not 4.5
>> char(System.Environment.Version.ToString)
ans =
4.0.30319.18034

% My system uses .Net 4.0, so we should compile for .Net 4.0, not 4.5 >> char(System.Environment.Version.ToString) ans = 4.0.30319.18034

As with Java threads, .Net threads are most effective when they can run independently of Matlab and of each other. I do not know of any mechanism for data synchronization between .NET threads and Matlab. However, we can use one of the standard IPC mechanisms, as I shall discuss in a future article. For example, it is possible to open a COM connection to the invoking Matlab (serving as an automation server) and then use it in the .Net code.

Related posts:

  1. Explicit multi-threading in Matlab part 1 – Explicit multi-threading can be achieved in Matlab by a variety of simple means. ...
  2. Explicit multi-threading in Matlab part 3 – Matlab performance can be improved by employing POSIX threads in C/C++ code. ...
  3. Explicit multi-threading in Matlab part 4 – Matlab performance can be improved by employing timer objects and spawning external processes. ...
  4. Multi-threaded Mex – Tips for creating and debugging multi-threaded Mex functions are discussed. ...
  5. Multi-line uitable column headers – Matlab uitables can present long column headers in multiple lines, for improved readability. ...
  6. Multi-column (grid) legend – This article explains how to use undocumented axes listeners for implementing multi-column plot legends...
Dot-Net Performance Undocumented feature
Print Print
« Previous
Next »
Leave a Reply
HTML tags such as <b> or <i> are accepted.
Wrap code fragments inside <pre lang="matlab"> tags, like this:
<pre lang="matlab">
a = magic(3);
disp(sum(a))
</pre>
I reserve the right to edit/delete comments (read the site policies).
Not all comments will be answered. You can always email me (altmany at gmail) for private consulting.

Click here to cancel reply.

Useful links
  •  Email Yair Altman
  •  Subscribe to new posts (feed)
  •  Subscribe to new posts (reader)
  •  Subscribe to comments (feed)
 
Accelerating MATLAB Performance book
Recent Posts

Speeding-up builtin Matlab functions – part 3

Improving graphics interactivity

Interesting Matlab puzzle – analysis

Interesting Matlab puzzle

Undocumented plot marker types

Matlab toolstrip – part 9 (popup figures)

Matlab toolstrip – part 8 (galleries)

Matlab toolstrip – part 7 (selection controls)

Matlab toolstrip – part 6 (complex controls)

Matlab toolstrip – part 5 (icons)

Matlab toolstrip – part 4 (control customization)

Reverting axes controls in figure toolbar

Matlab toolstrip – part 3 (basic customization)

Matlab toolstrip – part 2 (ToolGroup App)

Matlab toolstrip – part 1

Categories
  • Desktop (45)
  • Figure window (59)
  • Guest bloggers (65)
  • GUI (165)
  • Handle graphics (84)
  • Hidden property (42)
  • Icons (15)
  • Java (174)
  • Listeners (22)
  • Memory (16)
  • Mex (13)
  • Presumed future risk (394)
    • High risk of breaking in future versions (100)
    • Low risk of breaking in future versions (160)
    • Medium risk of breaking in future versions (136)
  • Public presentation (6)
  • Semi-documented feature (10)
  • Semi-documented function (35)
  • Stock Matlab function (140)
  • Toolbox (10)
  • UI controls (52)
  • Uncategorized (13)
  • Undocumented feature (217)
  • Undocumented function (37)
Tags
AppDesigner (9) Callbacks (31) Compiler (10) Desktop (38) Donn Shull (10) Editor (8) Figure (19) FindJObj (27) GUI (141) GUIDE (8) Handle graphics (78) HG2 (34) Hidden property (51) HTML (26) Icons (9) Internal component (39) Java (178) JavaFrame (20) JIDE (19) JMI (8) Listener (17) Malcolm Lidierth (8) MCOS (11) Memory (13) Menubar (9) Mex (14) Optical illusion (11) Performance (78) Profiler (9) Pure Matlab (187) schema (7) schema.class (8) schema.prop (18) Semi-documented feature (6) Semi-documented function (33) Toolbar (14) Toolstrip (13) uicontrol (37) uifigure (8) UIInspect (12) uitable (6) uitools (20) Undocumented feature (187) Undocumented function (37) Undocumented property (20)
Recent Comments
Contact us
Captcha image for Custom Contact Forms plugin. You must type the numbers shown in the image
Undocumented Matlab © 2009 - Yair Altman
This website and Octahedron Ltd. are not affiliated with The MathWorks Inc.; MATLAB® is a registered trademark of The MathWorks Inc.
Scroll to top