Hi John, I am currently pursuing similar effort. I got a GPIO pin on the BeagleBone Black embedded board toggling in hard real-time and verified the jitter with an oscilloscope. For that, I used a vanilla Linux 4.4.11 kernel with the PREEMPT_RT patch applied. I also released an initial version of a Julia package that wraps the clock_nanosleep() and clock_gettime() functions from the POSIX real-time extensions. Please see this other thread: https://groups.google.com/forum/#!topic/julia-users/0Vr2rCRwJY4
I tested that package both on Intel-based laptop and on the BeagleBone Black. I am giving some of the relevant details below.. On Monday, June 6, 2016 at 5:41:29 AM UTC-4, John leger wrote: > > Since it seems you have a good overview in this domain I will give more > details: > We are working in signal processing and especially in image processing. > The goal here is just the adaptive optic: we just want to stabilize the > image and not get the final image. > The consequence is that we will not store anything on the hard drive: we > read an image, process it and destroy it. We stay in RAM all the time. > The processing is done by using/coding our algorithms. So for now, no need > of any external library (for now, but I don't see any reason for that now) > > First I would like to apologize: just after posting my answer I went to > wikipedia to search the difference between soft and real time. > I should have done it before so that you don't have to spend more time to > explain. > > In the end I still don't know if I am hard real time or soft real time: > the timing is given by the camera speed and the processing should be done > between the acquisition of two images. > We don't want to miss an image or delay the processing, I still need to > clarify the consequences of a delay or if we miss an image. > For now let's just say that we can miss some images so we want soft real > time. > The real-time performance you are after could be 95% hard real-time. See e.g. here: https://www.osadl.org/fileadmin/dam/rtlws/12/Brown.pdf > > I'm making a benchmark that should match the system in term of complexity, > these are my first remarks: > > When you say that one allocation is unacceptable, I say it's shockingly > true: In my case I had 2 allocations done by: > A +=1 where A is an array > and in 7 seconds I had 600k allocations. > Morality :In closed loop you cannot accept any alloc and so you have to > explicit all loops. > Yes, try to completely avoid memory allocations while developing your own algorithms in Julia. Pre-allocations and in-place operations are your friends! The example script available on the POSIXClock package is one way to do this (https://github.com/ibadr/POSIXClock.jl/blob/master/examples/rt_histogram.jl). The real-time section of the code is marked by a ccall to mlockall() in order to cause immediate failure upon memory allocations in the real-time section. You can also use the --track-allocation option to hunt down memory allocations while developing your algorithm. See e.g. http://docs.julialang.org/en/release-0.4/manual/profile/#man-track-allocation > > I have two problems now: > > 1/ Many times, the first run that include the compilation was the fastest > and then any other run was slower by a factor 2. > 2/ If I relaunch many times the main function that is in a module, there > are some run that were very different (slower) from the previous. > > About 1/, although I find it strange I don't really care. > 2/ If far more problematic, once the code is compiled I want it to act the > same whatever the number of launch. > I have some ideas why but no certitudes. What bother me the most is that > all the runs in the benchmark will be slower, it's not a temporary slowdown > it's all the current benchmark that will be slower. > If I launch again it will be back to the best performances. > > Thank you for the links they are very interesting and I keep that in mind. > > Note: I disabled hyperthreading and overclock, so it should not be the CPU > doing funky things. > > > Regarding these two issues, I encountered similar ones. Are you running on an Intel-based computer? I had to do many tweaks to get to acceptable real-time performance with Intel processors. Many factors could be at play. As you said, you have to make sure hyper-threading is disabled and not to overclock the processor. Also, monitor the kernel dmesg log for any errors or warnings regarding RT throttling or local_softitq_pending. Additionally, I had to use the following options in the Linux command line (pass them from the bootloader): intel_idle.max_cstate=0 processor.max_cstate=0 idle=poll Together with removing the intel_powerclamp kernel module (sudo rm intel_powerclamp). Caution: be extremely careful with such configuration as it disables many power saving features in the processor and can potentially overheat it. Keep an eye on the kernel dmesg log and try to monitor the CPU temperature. I also found it useful to isolate one CPU core using the isolcpus=1 kernel command line option and then set the affinity of the real-time Julia process to run on that isolated CPU (using the taskset command). This way, you can almost guarantee the Linux kernel and all other user-space process will not run on that isolated CPU so it becomes wholly dedicated to running the real-time Julia process. I am planning to post more details to the POSIXClock package in the near future. Best, Islam