From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_00,FROM_WORDY, INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,fd3a5ba6349a6060 X-Google-Attributes: gid103376,public From: "Nick Roberts" Subject: Re: should I be interested in ada? Date: 1999/02/23 Message-ID: <7av53r$goc$2@plug.news.pipex.net>#1/1 X-Deja-AN: 447623662 References: <7a72e6$g55$1@probity.mcc.ac.uk> <36C93BB4.1429@ecs.soton.ac.uk> <7afc1o$3mi$2@plug.news.pipex.net> <7afttr$7v3$1@nnrp1.dejanews.com> <7aganu$qsc$1@plug.news.pipex.net> <36CC3AEA.59E2@lanl.gov> <7ai502$6an$1@nnrp1.dejanews.com> <36CD8DBA.237C@lanl.gov> <7akvao$j5t$2@plug.news.pipex.net> <36D1D862.41C6@lanl.gov> X-MimeOLE: Produced By Microsoft MimeOLE V4.72.3110.3 Organization: UUNET WorldCom server (post doesn't reflect views of UUNET WorldCom) Newsgroups: comp.lang.ada Date: 1999-02-23T00:00:00+00:00 List-Id: William Clodius wrote in message <36D1D862.41C6@lanl.gov>... [...] |> procedure Reorder (Object: in out Vector; Index: in Selection) is |> Temp: constant Vector := Object; |> begin |> for i in Index'Range loop |> Object(Index(i)) := Temp(i); |> end loop; |> end; |> | |Even neglecting parallelization issues, the above code does not catch |the semantics of the FORALL loop, in particular the FORALL does not |require that either X or J be dimensioned 1:N, only that: | |1. the index range include 1:N; |2. X's range include all values of J(1:N); and |3. the values of J(1:N) not have any duplicates. | |As a result Temp as declared above is assumed to be larger than the |requirements might actually be, and Index might range past the desired |bounds. Its true that the Ada code doesn't capture the same semantics - essentially that no component of Object will be assigned more than once (and they can be assigned in any order) - but I'm not sure that this will make any difference in practice (for a non-parallel target). The Ada procedure is inlined, so the optimizer may have the opportunity to eliminate null operations (e.g. assignment to self). I think Temp being too long will often not be a problem (for a clever dataflow analysing optimiser). Anyway, the problem can always be got around 'by force', by passing one or two more parameters into the procedure. As for the 'parallelization issues', possibly one or two pragmas might help for SIMD machines (as suggested by another poster recently, I think). pragma Assume(Parallel_Update,Object); pragma Assume(Spanning_Bijection,Index); This is, admittedly, a bit hypothetical, since (to my knowledge) there is no Ada compiler targetting a SIMD architecture, and no immediate prospect of there being one. Parallel processor targets can be catered for, in Ada, by encapsulating a multiple-task solution inside a procedure. I have constructed such a thing myself (for matrix inversion), as a 'technology demonstrator'. Not neat, but effective. |William B. Clodius Phone: (505)-665-9370 |Los Alamos Nat. Lab., NIS-2 FAX: (505)-667-3815 |PO Box 1663, MS-C323 Group office: (505)-667-5776 |Los Alamos, NM 87545 Email: wclodius@lanl.gov ------------------------------------- Nick Roberts -------------------------------------