First off, MS-Outlook categorized this as junk email. Hahahahaha. Stupid junk filtering.
The C++/UDP does work for me since it is processing request to the webserver which should finish operation within a minute. :) -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Oleg Kobchenko Sent: Friday, February 16, 2007 3:32 PM To: General forum Subject: RE: [Jgeneral] speeding up J This brings about a more general area of distributed computing. It has been addressed in many different ways: custom solutions (like below), COM+ and ORBs app servers, message queues, load balancers, more recently .NET Workflow foundation and Process Management BPEL solutions. One of the misconceptions is treating the problem on a tools choice basis instead of with a system approach, resulting in conflict of interest and vendor locks. As a result, simple and efficient solutions are overlooked and overdesign occurs. For example, many distributed problems can be implemented with a very simple and familiar tool: a web server, which is available everywhere, more reliable, understood, instrumented, etc. than any other distributed system. In fact, it has been discovered for a good use: Web Services, but which again are starting grow over with complicated protocols, sub-standards and library tools with drown the simplicity in layers of vendor-based "technologies", "open" or Java "standards" included. The C++/UDP is probably neat, but for a few-minute tasks, the subsecond overhead of J CGI invokation is not a problem. With async client web calls (like HTTPXml as in AJAX--another tool-abused solution), not only can several instances get launched, but completion syncronized and results collected. (Note, the example below is not so much about speed up J accross CPUs, as compensating for latencies of external I/O.) Notwithstanding, the C++/UDP would still be a good approach in case of a situation with numerous request per second. A final note, although C++ (another tool) bears the spell of low-level access and high performance, J in most cases can do the same in a comparable time frame. --- Alex Rufon <[EMAIL PROTECTED]> wrote: > I badly needed a "parallel" capability in J a year ago. My MRP > calculation was taking 40 minutes to complete. The whole process is > actually 8 verbs that are needs to be executed. Each of the methods was > independent of each other and does not depend on any prior method to > execute. > > My solution to this was Sockets using UDP one way invocation. So I got > two PC's running (you can do this on the same machine); the web server > which holds the "client" and the application server which where I wrote > a C++ service which accepts UDP messages and creates a new instance of > J. I basically gave each method its own J session and run it > independently. It worked and the whole thing on the server completes in > a few minutes while the client think its done already. :P > > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of Skip Cave > Sent: Wednesday, February 14, 2007 5:45 AM > To: General forum > Subject: Re: [Jgeneral] speeding up J > > Raul Miller wrote: > > What does "first" mean in the context of "parallel"? (Does it mean > > anything different than "randomly choosen"?) > > > Skip says: > > In the case of my "parallel" operation definition, "first" has a very > specific meaning. The parallel function I described is defined such that > > it is impossible to start two or more parallel operations at the same > time. Of course, many parallel operations can be _executing_ at the same > > time, but each of the operations must start in a sequential manner. By > definition, all parallel tasks started by the parallel function will > have a well defined, and well known, order of execution start. This > establishes a "priority" of parallel tasks, which helps to prevent the > types of conflicts that can arise when multiple tasks attempt to work on > > the same data at the same time. So when I say "first", I mean the order > of execution start, which defines priority, nothing more. In your > example: > > 'A B C'=: exp"0(4 4 4) > parallel each A;B;C > > The order of starting of the functions A, B, and C must be defined. If > we say the order is start A, then start B, then start C, that defines > the start order. The actual delays between the consecutive starts could > be a few nanoseconds. Thus if A is started first, then any reference to > variables accessed or modified in A by B or C would be blocked until A > completed operations on that variable. It would be the job of the > interpreter to make sure this rule was enforced. If there are common > variables, the B & C processes would have to wait on the A process to > finish operating on the shared variable before they could operate on it. > > Raul Miller wrote: > > For that matter, what does "lock" mean? Does that mean that any > attempt > > to read that variable must wait until the other expression is > complete? > > > Skip says: > The lower-priority parallel process doesn't necessarily have to wait > until the higher priority process has completely finished to access a > shared variable, but the lower task at least must wait until the > higher-priority process has completely finished with its work on the > shared variable, before it can proceed. . > > Raul Miller wrote: > > Or does it mean that writes to the variable are atomic? > Skip says: > No. Atomic writes would be a much more complex problem to prevent > conflicts > > Raul Miller wrote: > > [Do you see how these can be different?] Or does it mean something > else? > > Skip says: > Yes, they are obviously different, and the second one is prohibited. > > > Raul Miller wrote: > > What happens when thread A is waiting on thread B, but thread B is > waiting on > > thread A? > Skip says: > This will never happen with the parallel function, because the "first" > started parallel task, in this case A, will always preempt the other > started tasks. A will never wait on B, as A has priority on all variable > > operations that may conflict between A & B (or C). B will always wait on > > A if there are shared data operations because of this priority. > Similarly, B will never wait on C, as B has priority on all variable > operations that may conflict between B & C. C, being the low man on the > totem pole, will have to wait on anybody who is working on a variable > that they share in common. > > This encourages the programmer to break up the data under work in such a > > way to prevent shared access of the same data, if the programmer wants > to optimize parallelism. Otherwise, the program will run sequentially, > with little or no gain in execution speed. I learned this priority trick > > to prevent parallel conflicts years ago, working on real-time parallel > > schemes for character recognition engines. > > > Raul Miller wrote: > > Consider: > > > > a=:a,b > > > > What happens here in a parallel context? (Remember that J allocates > > up to double the strictly necessary space for arrays to make > > this expression fast in the typical case.) > > > Skip says: > > Since this example does not use the parallel function, there will be no > parallel execution of the assignment. > >>> (Would it acceptable to make J substantially slower in > >>> contexts where it's currently fast so that it can run multiple > >>> threads?) > >>> > >> > >> No. The interpreter should be designed to attempt parallelization > >> only if it will significantly speed up the execution of a > >> specific primitive. > >> > > > > I thought we were discussing your "parallel" operation, hinted at > > above? Are you saying that certain primitives would throw an > > error if they were used in one of these threads? > > > You are justified in being confused here. I was mixing discussions. My > response was about the parallelization of primitives. If primitives in J > > were to support parallelism, then they should only resort to the > parallelism when it benefited performance, and not impact performance if > > parallelism were not used. The parallelism should be invisible, and no > error should be thrown if parallelism was not deemed efficient enough to > > use by the interpreter. A slight degradation in overall J performance (< > > 0.1%) would be acceptable to deal with the overhead in making the > parallel/no-parallel decision. > > Moving to the coarse parallelism discussion, the parallel operation > should be a separate function in J, and should not impact the execution > of any code that was not requested to be run in parallel by the > programmer, using the parallel function.. > > Skip Cave ________________________________________________________________________ ____________ Bored stiff? Loosen up... Download and play hundreds of games for free on Yahoo! Games. http://games.yahoo.com/games/front ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
