Thursday, August 05, 2010

English as a first language

I admit it. I hated English in school. Well, perhaps hate is too strong a word. It was more that there were other subjects that i preferred. I don't hate chocolate ice cream. I simply prefer vanilla. But i was talking to someone who majored in English in college the other day, and it got me thinking.

So why was English less than my favorite subject? It's probably the way grammar and spelling are taught. The way grammar is often taught is to explain the rules of grammar, with heavy emphasis on this is a noun and all sentences have at least a noun and a verb. It largely ignores the simple fact that English has no rules at all that aren't regularly broken. By the time the average American child is ten years old, they've learned 10,000 words of vocabulary, but also 10,000 rules of grammar. This is as large a vocabulary as adults master for most other languages. And really, come on. A rule for every word is pretty much the same as an exception for every rule. That's like saying that there are no rules at all. And American children don't learn these things by having to remember either the rules or the names of the rules. They do it by usage. And usage is how the language is defined. Really. Dictionaries are written by examining published material. That's why congress critters and others can routinely verb words. (The word verb is, of course, a noun). And, of course, learning just exactly what words are nouns, verbs, adverbs, adjectives, pronouns, prepositions, and so on, and what, exactly, the rules are for these things is roughly irrelevant to the English speaking child.

Here's an example. As a former child, i remember these, and swore i'd never torture my kids with them, should i ever have any. As a parent, i enjoy torturing my kids with them. There are few other perks being a parent, so one must enjoy the opportunities available. Johnny and me went to the park. The correct phrasing is Johnny and I went to the park. Please don't explain what rule this breaks. The correct way to teach this is as follows. One must drop the Johnny and bit and see if it still sounds right. So, Me went to the Park doesn't scan as well as I went to the Park. And yet, when i was a kid, i didn't respond even to the full grammar lesson, with what amounts to technojargon words and rules, using what ever in a sing-song voice, as i routinely get now, even with my methods. So, there are at least two things to note here. The education problem is much harder these days, now that we don't demand so much respect from kids. And, it's likely that we're attempting to teach kids the full grammar rules before they're mentally equipped to deal with them.

I did hear a Johnny and me reference on the radio recently. It was correct. Which is to say, it passed my test. I can't remember when (if ever) i've encountered anyone doing it right. Maybe the simpler rule is to simply always use Johnny and I. It may not always be right, but it may be right so much more often as to not make any difference. You heard it first here.

Spelling is even easier to teach. Tell the kids to write lots of stuff, and demand that they use spelling checkers. Have them turn off the word processor feature that corrects words as you type. This feature doesn't teach anything. Have the word processor mark anything it doesn't understand, and allow it to offer suggestions. This is how i learned to spell. Learning vocabulary words by rote was irritating. It also wasn't nearly as effective at expanding vocabulary as simply reading challenging books.

This correct-as-you-type feature is pretty evil. IMCO (In My Considered Opinion), the feature should be removed from all software. It often "corrects" words that have been typed correctly. That is, it often introduces errors. I often use a specialized vocabulary, for computers, engineering, or some other business. I end up having to type the same word correctly half a dozen times in the course of editing. I often have to come up with unique tricks to get what i need, such as writing some longer word, and deleting bits of it to get the right spelling. I even have to correct broken capitalizations.

I went to an Engineering school. And i work with engineers. With few exceptions, these people are brilliant, well rounded people. But they often have poor English skills. They leave out articles, make references using pronouns without clearly establishing what the references are for, and so on. And many of these people only know one language. It's often far worse when English isn't their first language. From a strictly business point of view, one might say, who cares? The work is getting done, right? And these people are brilliant, right? But poor documentation, especially unclear and ambiguous documentation can lead to needless rework and worse. Worse is documentation that misleads. One could call it anti-documentation. You're actually better off without anything. It has negative value.

Now, when i went to school for engineering, there was considerable opportunity to write. There were lab reports and other assignments. There were requirements to do work outside of your chosen major. Usually, these were not graded on English grammar or spelling, however. There were projects that one needed to do in groups. Since i had advanced computer editing, formatting and typing skills, i generally typed up the group projects. And, it was somewhat of a surprise to me that my ability to compose prose was generally superior to that of other students. After all, these kids were all off-the-wall brilliant. I completely ignore students for which English was not their first language here. I'm talking about native English speakers. And yet, as far as i recall, the school did not offer an English course of any kind. But one really needs a firm understanding of English to achieve technical excellence. And technical excellence was clearly the primary goal of the school. So, while it isn't my opinion that engineering schools need to have an English department offering and capable of granting an English degree, they should offer English courses as an option. Otherwise, all students are stuck with whatever they happened to learn in high school.

How large is your vocabulary? It's worse than impractical to try to list all the words you know and count them. Humans are terrible at listing things, especially when the list is long, such as when there are more than about three items. And yet, it turns out that there is a fairly quick and simple way to find out. Get a dictionary that brags about the number of words it contains. Many college dictionaries boast half a million words. Get a blank piece of paper and a pencil. A pen will do. Make two columns, Right and Wrong. Open the dictionary to a random page. Jam your finger down the left edge without looking. Then slowly move your finger down until a new word is exposed. Examine the word. Do you know what it means? Can you use it in a sentence? Try it. Then read the definition. If you were right, make a mark in the Right column. Otherwise, make a mark in the Wrong column. Do this exactly thirty times. Now the math. Take the total number of words in the dictionary, multiply it by the number of words you got right and divide that by thirty. That is, multiply the total number by the fraction you got right. That's an estimate of the number of words you know. If you don't believe it, you can always use a larger sample than thirty, or repeat the experiment, or change dictionaries.

So, my spelling is now good enough that i frequently argue with my spelling checker. But there is a word that i always spell wrong. Everyone has one. For me, the word is wrong, which i always spell w r o n g.

Sunday, August 01, 2010

Practical hyperthreading

I recently read some inconsistent material concerning Intel's CPUs. It had to do with hyperthreading.

The idea behind hyperthreading is that you have more than one set of CPU registers (including hidden registers) so that it is very quick for the CPU to switch from one process to another. In fact, it can be done between every instruction. That is, if there are two processes currently runable, the CPU can execute instructions from alternating processes.

There are a couple of reasons one might want to do this. One might want to have separate state for operating system kernel instructions and user level instructions. One might have separate state so that interrupt routines would run quickly. No need to save the state, just use registers dedicated to running interrupt service routines. This was done for Digital's PDP-10 computer back in the 1970's.

But there is a problem for modern machines that's a little different. It's the memory wall. Eventually, the bottleneck for Von Neumen architecture CPUs is the communication of data between the CPU and main memory. One can delay this bottleneck for awhile, and this has been done, but it will eventually come up and smack you in the face. And these days, CPUs are much faster than main memory. So, while the CPU may execute instructions at three billion per second, main memory takes at least several nanoseconds to respond to a request. OK, so most memory references only go as far as the on-CPU chip cache. These requests may be satisfied in as little as a single cycle. But to go all the way out to main memory can take what seems like forever. At least, forever if you're a fast CPU. It can be over a hundred cycles.

So the idea is, have more than one process running. When an instruction is executed that fetches data from main memory, the CPU might have to wait for the result before the next instruction is executed. However, if the CPU switches to an entirely different process, then that processes' next instruction can't be waiting for this result. There's a better chance that it can proceed without waiting at all. If the CPU is idle less often, then it is doing more useful work per unit time. It's faster. For Intel, this is usually about 20% faster. That is, you get an extra 20% more cycles per unit time.

However. Let's say you have two processes. Each process will get about half of the available cycles. If the total is 120%, then each process will run at about 60% of the original speed. Yes, that's right, the total throughput is higher, but a single processor will run a single process faster. But consider that a single processor will run two processes at 50% each, rather than 60% each. Still, people worried about speed often want their single process to run as fast as possible. Can one get the best of both worlds?

Yes. Often, there is inherent parallelism available within an application. The operating system supports something called threads. An application can have two threads running at the same time. Both threads have access to all the memory of the application. And in a hyperthreading environment, both threads can contribute to the performance of the single application. Therefore, a single application can get the speed boost offered by hyperthreading. It requires more effort on the part of the programmer. The result is usually more complicated, and can be more difficult to debug (get right). But it can, and often is, done.

When hyperthreading became available, i fired up a benchmark, timed a run of one copy. Then timed a run of two copies at the same time. Then, i went into the BIOS, turned on hyperthreading, and reran both tests. With hyperthreading turned off, the results were 100% speed with one process, and 50% for each with two simultaneous processes. With hyperthreading turned on, the results were 100% speed with one process and 60% for each with two processes. There was no additional gain to be had in total bandwidth for more than two processes with my simple benchmark. The benchmarks perform a fixed amount of work. So by 50%, i mean that this work load takes twice as long (wall clock) to execute. By 60% speed, i mean that this work load takes 1.66 times as long measured by the wall clock (1 / 1.66 = 0.60). Very simple.

But i started this article talking about confusion i've seen. One of the things i've heard stated is that if you turn on hyperthreading, your speed is immediately cut in half. This may be due to the way that the tools report your performance. We pretty much have an idea what 100% means if there is a single CPU with no hyperthreading. 100% use means that the CPU is totally consumed. But with hyperthreading turned on, some tools report 100% if two threads are executing the entire time. And if only one process is running, these tools often report 50%. However, in this later case, the CPU isn't idle. It's getting 83% (100 / 120) as much work done as is possible with this CPU. But this is exactly as much total work as the CPU would have done if hyperthreading were turned off.

And it gets worse. Some tools report 200% instead of 100%, as above. That's on the same running system. With some tools reporting 100% and others reporting 200%, it's a royal pain to compare results. And those reporting up to 100% often end up reporting 102% from time to time.

And it gets worse still. The operating system reports the CPU time that a process uses based on the runable time and the number of processes that were runable at the time. But the performance during that time can vary by 20%. So, CPU time doesn't measure total cycles delivered very accurately or repeatably. Well, with demand paging, this has been true for awhile anyway. Page replacement interrupts, TLB replacement interrupts, and even I/O interrupts all take their toll on accounting. So, IMO, it's not that much of a loss.

My new 4 core AMD Phenom II does not appear to support hyperthreading. I wish it did. But it still suffers a bit from poor accounting. My operating system tools sometimes report up to 400% CPU utilization, and sometimes report up to 100% CPU utilization.

And yet, there is a downside to hyperthreading. It has to do with priority. I often run a very long running background process, with the priority set as poor as possible. And Unix (or Linux) will typically give this process nearly 100% of the CPU when nothing else is running. And if there is a normal priority process running, then the background process will get 5%, with the foreground process getting 95%.

But with hyperthreading turned on, two processes may run at full speed because the operating system treats threads as CPUs. Since there are two CPUs (there aren't, really), the operating system lets them both run at full speed. That means that each process gets 60% of the single CPU speed. That's much less than 95% for the normal priority process, and much more than 5% for the low priority process. And there are times when i'm impatient enough to want that extra 35%. In fact, it's been awhile, but at one time i ran a Unix variant that would give the normal priority process 100% percent, with no cycles at all going to the low priority process. I miss those days. They were nice, or is it not so nice?