Spin under SimpleIDE: compiled or interpreted?
samuell
Posts: 554
Hi,
I've recently discovered that SimpleIDE supports the Spin language. I'm really new to that language, and I'm confused because it can be compiled (or translated to machine code) or interpreted on chip, depending on the reference I read. So, my question is, if I use SimpleIDE to program in Spin, will my code compile or be interpreted on the fly?
I ask this because interpreted languages are not my cup of tea, as they are by no means faster.
Also, is C actually being compiled, or sort of interpreted? I notice that it could be a lot faster. My PC has two "cogs" running at 3.2GHz, and is at least 1000x plus faster when calculating prime numbers than the P8X32A, that has 8 cogs, but uses 7 of them to perform the calculations. Doesn't make sense that the difference is so big, considering that I'm using LMM to boost it up.
Kind regards, Samuel Lourenço
I've recently discovered that SimpleIDE supports the Spin language. I'm really new to that language, and I'm confused because it can be compiled (or translated to machine code) or interpreted on chip, depending on the reference I read. So, my question is, if I use SimpleIDE to program in Spin, will my code compile or be interpreted on the fly?
I ask this because interpreted languages are not my cup of tea, as they are by no means faster.
Also, is C actually being compiled, or sort of interpreted? I notice that it could be a lot faster. My PC has two "cogs" running at 3.2GHz, and is at least 1000x plus faster when calculating prime numbers than the P8X32A, that has 8 cogs, but uses 7 of them to perform the calculations. Doesn't make sense that the difference is so big, considering that I'm using LMM to boost it up.
Kind regards, Samuel Lourenço
Comments
The result of this is that your program is compiled down to a small size allows more functionality in the limited space of the Prop. But it is much slower than executing native instructions.
This is all somewhat like the Java system.
The above is true for the original Prop Tool, and later tools like BST, HomeSpun, OpenSpin, PropellerIDE, SimpleIDE. I believe you can now compile Spin to native code with some newer tools. I have never tried this.
The C compilers generate a sort of native code. A Prop cannot execute native code from the 32K shared RAM, only the 512 LONGs within it's COG space. To get around this C compilers generate native instructions that are read from HUB by a "kernel" running in a COG and executed in the COG one at a time. This allows for big C programs but is about 4 times slower than actual in COG native code.
I'm not sure why you are surprised at the difference in speed between you PC and a Propeller. A rough estimate is that a Prop can run code at a speed of 20MIPS. It has 8 COGS so that is 160MIPS. Absolute maximum if you make use of all a COGs in your program at 100% efficiency.
So a Prop is 20 times slower than your PC.
But even if your program made use of all 8 COGs it would probably only get a speed up of about 4.
So a Prop is 40 times slower.
But if you are running compiled C code you might lose another factor of 4
So a Prop is 160 times slower.
But if you are using Spin you might loose a factor of 100
So a Prop is 4000 times slower.
Then the Prop has no multiply or divide instructions so you loose a lot more.
Honestly, how can you expect a 20MIPS micro-controller to come near a 3GHz PC?
By the way, don't have a downer on interpreted languages. Java and C# get their speed through compilation to byte code and then Just In Time compilation of that byte code to native instructions when they are run. Javascript has no byte code stage but it runs nearly as fast as native C++ in many applications.
Yes, I would be expecting the Propeller to be much slower, but not that much. I'm still impressed by the speed, don't get me wrong. This is quite a powerful micro with a great architecture. But then I did some calculations, and the assumed difference ratio was not right. I would expect it to be 20 times slower, or a value like that. Having an Intel E6700 (Pentium) doesn't make my PC awesomely fast.
So, basically, if I translate my C program to Spin I'm actually getting no advantage?
Kind regards, Samuel Lourenço
But it's more complex than that. prop-gcc can identify short loops in your source code. When it finds them it can compile them to real native instructions rather than LMM. At run time it loads the entire compiled loop into HUB and runs it at full native speed. This is called "fcache" if you want to search for it here.
I wrote a Fast Fourier Transform in C which has an inner loop that can be fcached. The result is that the C version runs almost as fast as the hand crafted assembler version of the same algorithm! Not bad.
I then went the next step and made my FFT use multiple COGS. I used OpenMP to get the compiler to split the loop and distribute the work to 2 or 4 COGs. Whilst this does speed things up it is by no means by a factor of 2 and 4 respectively. The more COGS you use the less effective parallelization becomes.
The code for that FFT is here: https://github.com/ZiCog/fftbench There is the same algorithm implemented in C, Spin, BASIC and other languages just for comparisons sake. The C version is pretty amazing I think, it gets a speed boost through fcache and another speed post through OpenMP, all without having to change the code.
Bottom line. If you want fast, don't use Spin. Unless you are prepared to write the fast bits in PASM.
(1) It can be converted to bytecodes which are then interpreted by a program in the ROM. This is by far the most common way Spin is used. Bytecode converters include Propeller Tool, openspin, bstc, and homespun. I don't use SimpleIDE myself, but from glancing at the manual it appears that it uses openspin to convert Spin to bytecode. It may be possible that you can change the bytecode compiler, in which case it might be possible to change SimpleIDE to use one of the methods below.
(2) It can be converted to C++ (or plain C) via a program called spin2cpp, and then compiled with PropGCC. This would kind of make sense for SimpleIDE, so it was my first guess as to how it works, but I don't see it mentioned in the manual.
(3) Recent versions of spin2cpp are able to output PASM code (or indeed executable binary) directly, providing yet another way to compile Spin to machine language. Code may be placed directly in a COG (if small enough) or executed in LMM mode from hub (see below).
Again, there are 3 choices:
(1) Very small programs may be compiled with -mcog, which produces direct machine code that runs in a single COG. The program must fit in the 2K memory space available.
(2) The default mode of operation is LMM. In this mode there is a sort of interpreter that fetches instructions from hub memory and executes them in COG memory. The instructions fetched are actually machine code, so LMM represents an in-between state between an interpreter and compiler; technically it's an interpreter, but it's "interpreting" machine code so it's very fast. As Heater mentioned above, even in LMM mode some small loops are executed entirely inside the COG via FCACHE.
(3) PropGCC also provides a mode called CMM which is more of a traditional interpreter. In CMM it outputs compressed versions of the machine instructions, which are then decoded via an interpreter running in the COG. There's a 1-1 correspondence between CMM instructions and actual PASM instructions, so the CMM interpreter can convert CMM codes into machine code relatively quickly, but the CMM codes take up more space than Spin bytecodes.
Regards,
Eric
Kind of ignoring it's basic features like it's clock rate and MIPS, it's lack of hardware multiply/divide. Never mind floating point and so on.
Also ignoring some of it's main attractions like the tight coupling between cores and I/O.
In some regards the Prop is a "super computer", if what you want to do is "bit-banging" in a timing deterministic way it will run rings around any 3GHz Intel equipped PC, or a super computer sized cluster of them.
Otherwise. No.
(5) A "threaded" interpreter is very fast because its bytecodes are simply addresses of machine code routines to execute. Forth is usually implemented this way, and Tachyon Forth in particular is a very fast interpreter for the Propeller. Generally these are much faster than Spin bytecodes, but not as fast as LMM.
(6) There are also interpreters that implement instruction sets of other CPUs, e.g. a Z80 interpreter. These are slowest of all, but interesting because they allow us to run programs from other computers (including potentially compilers for the interpreted CPU).
I'm studying the possibility of applying this chip in devices that require some analytical computing power, but nonetheless are easy to program (don't require an OS like the Intel), are self contained and can run embedded. I think the Propeller is great for those applications. It is remarkably fast (never dared to do somethink like this on a PIC) and still fairly easy to program.
The prime numbers calculation program it was just an evaluation program. I didn't intended to do something useful to the end user. However, it has been useful already in the most unexpected ways. I now use it to test the stability of my projects (especially when the Prop is overclocked). I'm already tinkering with my board in order to improve the overvoltage protections (which, in the meantime, make any overclocking impossible, as the voltage doesn't pass over 3.6V, and the ideal would be 3.8V).
Well, heater, it seems I have to try that "fcache" option. It didn't ran well last time, but I forgot that I had the Prop overclocked at 128MHz (I know it is insane - long story).
Kind regards, Samuel Lourenço
I'm afraid I was misunderstood here. I'm not looking for a co-processor. Of course Propeller doesn't support floating point or multiply/divide by hardware alone, but nonetheless it is a favourite so far (or I just say that because I'm in love with it). I'm using is as main processor. Nevertheless, for an oscilloscope or something like that I may have to look for another micro (or maybe use an FPGA, but I have to learn Verilog, yuck). I don't imagine that the P1 can acquire data from a 500MSPS DAC, and furthermore, oversample the data in real time. Maybe the P2 does.
By the way, will the P2 support hardware floating point operations, as well as multiplications and divisions? I can always use a math co-processor. This one seems to be interesting, as it can communicate with the Propeller via SPI. I think this was somewhere indicated in the forum, but I don't recall.
Kind regards, Samuel Lourenço
- I would have to find a way of creating a new type, as long long wouldn't cut it;
- Memory wouldn't cut it;
- Using the disk drive would be too slow, too hard on the drive and wouldn't cut it.
Now, replacing the Propeller with a CPU, as someone suggested:
- Would have to integrate the CPU with all other peripherals and memory - Propeller has that implemented;
- PCB hi-speed design is better left for the professionals - I'm not one;
- Would not be embedded nor easy to program (if you consider Raspberry Pi to be embedded, it is not, it is a PC like any other).
So, given the above, I think the Propeller is just the ideal. My idea is not to surpass my PC (that would be an absurd on my behalf), but to make the most of it. If I can run faster with the same hardware, then why not?
Kind regards, Samuel Lourenço
What is it you actually want to do?
We would like to offer suggestions but without a goal in mind it's impossible.
For example, if prime numbers is the thing then it's just as well to pre-calculate them and store them on SD card or whatever for the program on the Prop to use as required.
But I doubt that is what you are aiming for.
The Raspberry Pi can certainly be "embedded". It may well be a full up Linux running machine (usually) but if I embed all that in some system where it just does whatever I programmed it to do and the user does not even know it's there, then that is an embedded system. I have built many such Linux based embedded systems starting about 15 years ago. The Pi is a new kid on the block.
Now you've asked the right question. I don't have a goal. I'm just studying that this puppy can do. I am not a programmer, nor an electrical engineer, but I do like to venture into electronics. It wouldn't be challenging to me to use a board that was already made. Big part of the fun consists on designing my PCBs. Actually, I learn far more from doing it than from seeing others doing it, or studying what other do. Having said that, a CPU is out of reach to me because it involves too technical stuff and hi-speed design concepts that I don't have not I'm capable of (nor I will, I think, but if I find time that can change).
On the other hand, FPGA's require knowledge that I don't have, nor I will. I know nothing about micro-electronics, nor I will invest on that field, I'm certain (micro-electronics is boring and I prefer to be shot in the head, sorry if offence is taken for this choice of mine, but I hate physics). I'm more an analog and low speed type of guy, because that is what I like. I ventured into the Propeller out of curiosity, but I'm now finding it very useful. That's it.
Kind regards, Samuel Lourenço
I'm afraid that FPU will be hard to source. The owner of the company died of cancer a couple of months ago, bad news, he was a one man operation. I have been trying to find a source for months. The only stock seems to be in France, and they will not ship out of the EU.
EDIT: They MAY ship to PORTUGAL.
Sorry to hear that. I can't find any equivalents. Since the chip is discontinued, it would not be good for new designs, but still a very interesting option for development.
I'm in Portugal, yes. Where I can source those chips?
Kind regards, Samuel Lourenço
http://www.lextronic.fr/R1601-micromega-corporation.html
I admire your curiosity. There is no way we can all know everything about computer science, electronics, mathematics, etc, etc. Each one of which is a huge subject area. We all play with what attracts us.
BUT. What's up with Physics?
The basis of everything. Trying to understand the way the world works. What geek, of any discipline, could not be fascinated by that?
Fascinated and and fascinated enough to make it through all the math required for a proper understanding are two different things. I'm with samuell on this one
Physics is not about the maths. Physics is about experiment, observation of what the stuff around us actually does, reality. Kids in primary school can start to investigate that with no maths required.
Sure your Newtons and Einsteins come along and discover a ton of maths that happens to miraculously model what reality does. But, for example, the Fardays of this world had no idea about such maths when they were playing with electricity and magnets. The maths came later with Maxwell.
To paraphrase Newton: "Sure, I have the equations of motion and gravity, I have no frikken idea why they work"
Wish I could find the actual quote now.
So much for the "proper understanding". There is no such thing.
I was also fascinated by mathematics. Although never very good at it.
I must admit that when it came to university level physics the maths content pretty much overwhelmed me. It just kept coming, more and more, everyday, for four years, far too much for my tiny mind to adsorb. Perhaps I did not pick and choose what I should concentrate on wisely.
Then at some point you find you are doing a lot of maths but don't get to do the experiments. Like we didn't have a nuclear reactor or particle accelerator to play with! So it all gets to look very abstract and floats out of ones mind.
It's amazes me that I actually managed to graduate at all. The end result of that overload is that I forgot pretty much all of it the day after graduating. Still remember the experiments though. I mean, how do you weigh a single electron?
Anyway, maths equations don't explain anything. Newton is famous for such things as F = m * a and F = G * M * m / r * r. These are just a model of what goes on that enables one to make useful predictions about various situations. Newton also said:
"I have not yet been able to discover the cause of these properties of gravity from phenomena and I feign no hypotheses..."
Which is to say, here are some equations that work, I have no idea why.
It's not clear how one does even basic electronics without some equations. Ohms law, impedance of capacitors and inductors, resonant frequency of L/C tanks etc, etc.