[Jprogramming] j807 cd - pass array arguments
Ben Gorte
bgorte at gmail.com
Mon Nov 19 05:17:48 UTC 2018
When trying & , I apparently do not know what I am doing, because it
immediately crashes my session.
However, I do feel meanwhile that I get an increasing number of copies of
my (large) dataset in memory, so perhaps I should find out what I should be
doing. As I understand, & can help to avoid copying the data.
The basic situation is that I pass three arrays to my DLL function:
- a one-dimensional array with N integers,
- another one with N bytes (literals),
- and a 2D one with N x 2 integers.
N is up to of few hundred millions (but larger would be even better). The
first array is modified by the DLL; the others are 'read-only'.
Any suggestions are appreciated. In my function, the integers can be int or
long - what would be preferred? If they are the same size in J and C, does
it avoid (or reduce) copying?
Thanks again,
Ben
On Mon, Nov 19, 2018 at 1:58 PM bill lam <bbill.lam at gmail.com> wrote:
> "The memory is unaliased." refers to the memory as seen by
> the callee of cd. Any changes made by callee won't be written
> back to the original memory. That's why the value of names
> remained unchanged after cd call. Unless you had taken
> the address of name and passed the address to cd.
>> The release note also mentioned & but use it only if you
> know what you are doing.
>> 2018年11月19日, Ben Gorte написал(а):
> > Dear Henry, Bill, Linda,
> >
> > Thanks for your responses, I am getting the point/ers.
> >
> > Perhaps in
> >
> https://code.jsoftware.com/wiki/Guides/DLLs/Calling_DLLs#J807_Incompatibilities
> > , the phrase: "The DLL can read or write this memory." is a bit
> confusing,
> > although it also says "The memory is unaliased." That means "copied if
> > required", and I thought it wouldn't be...
> >
> > Anyway, all is well again,
> >
> > Thanks,
> > Ben
> >
> >
> >
> >
> >
> > On Mon, Nov 19, 2018 at 1:15 AM Henry Rich <henryhrich at gmail.com> wrote:
> >
> > > What Bill is saying is that starting in 807, cd makes an copy of any
> > > argument to cd that might be shared by another noun. So, the value of
> > > 'res' is put into a temporary block and passed to the DLL. The
> > > temporary block is put into the boxed result of cd. You need to look
> in
> > > that boxed result, not in the name res, which has not been modified.
> > >
> > > This change was made in 807 because that release has a much more
> > > aggressive policy of sharing nouns and parts of nouns without making
> > > separate copies; for example
> > >
> > > ({. name)
> > >
> > > actually gives you a pointer to the first item of name, without
> > > recopying it, and
> > >
> > > (i. 3)
> > >
> > > is liable to give you a pointer to unchangeable internal data. With all
> > > these pointers flying around we can no longer trust the user to know
> > > when it is safe to pass a pointer into a DLL that might modify the
> data.
> > >
> > > Henry Rich
> > >
> > > On 11/18/2018 7:55 AM, bill lam wrote:
> > > > j807 must get from result of cd, like this
> > > > 0 3{ (sqrdll, 'sqr i i *i *i') cd (#y);y;res
> > > >
> > > > On Sun, Nov 18, 2018, 2:22 PM Ben Gorte <bgorte at gmail.com wrote:
> > > >
> > > >> Dear All,
> > > >>
> > > >> Long ago I made quite a lot of c-functions that I am calling from J
> > > using
> > > >> the cd mechanism (load 'dll') in linux.
> > > >>
> > > >> They stopped working in j64-807. I see in the release notes that
> indeed
> > > >> something has changed, but I cannot quite relate that to my case
> (but
> > > maybe
> > > >> I should - I'm not sure I entirely understand the story).
> > > >>
> > > >> In the simplest form it looks like this:
> > > >> First the c-code, sqr.c :
> > > >> int sqr (int n, int a[], int b[])
> > > >> {
> > > >> int i, sumsqr=0;
> > > >> for (i=0; i<n; i++)
> > > >> sumsqr += b[i] = a[i] * a[i];
> > > >> return sumsqr;
> > > >> }
> > > >>
> > > >> which I compile with
> > > >> gcc -O3 -shared -fPIC -o sql.so -Wl,--no-as-needed sqr.c
> > > >> (omitting -O3 does not make a difference).
> > > >>
> > > >> In J I go like:
> > > >>
> > > >> load 'dll'
> > > >>
> > > >> sqrdll =: jpath '~user/ext/sqr.so '
> > > >>
> > > >>
> > > >> sqr =: 3 : 0
> > > >>
> > > >> res =. (#y)#4 NB. make sure it's integer
> > > >>
> > > >> ret =. (sqrdll, 'sqr > i i *i *i') cd (#y);y;res
> > > >>
> > > >> ret, res
> > > >>
> > > >> )
> > > >>
> > > >>
> > > >> Up until j806 I would get:
> > > >>
> > > >> sqr i.10
> > > >>
> > > >> 285 0 1 4 9 16 25 36 49 64 81
> > > >>
> > > >>
> > > >> But in j807:
> > > >>
> > > >> sqr i.10
> > > >>
> > > >> 285 4 4 4 4 4 4 4 4 4 4
> > > >>
> > > >>
> > > >>
> > > >> So my DLL 'reads' an array alright, but seems to be not 'writing'
> it.
> > > >>
> > > >>
> > > >> For completeness:
> > > >> JVERSION
> > > >> Engine: j807/j64/linux
> > > >> Release: commercial/2018-10-04T15:00:41
> > > >> Library: 8.07.20
> > > >> Qt IDE: 1.7.7/5.5.1
> > > >> Platform: Linux 64
> > > >> Installer: J807 install
> > > >> InstallPath: /home/ben/j64-807
> > > >> Contact: www.jsoftware.com
> > > >>
> > > >> Perhaps I'm overlooking something trivial; any help is highly
> > > appreciated!
> > > >>
> > > >> Ben
> > > >>
> ----------------------------------------------------------------------
> > > >> For information about J forums see
> http://www.jsoftware.com/forums.htm
> > > >
> ----------------------------------------------------------------------
> > > > For information about J forums see
> http://www.jsoftware.com/forums.htm
> > >
> > >
> > > ---
> > > This email has been checked for viruses by AVG.
> > > https://www.avg.com
> > >
> > > ----------------------------------------------------------------------
> > > For information about J forums see http://www.jsoftware.com/forums.htm
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
>> --
> regards,
> ====================================================
> GPG key 1024D/4434BAB3 2008年08月24日
> gpg --keyserver subkeys.pgp.net --recv-keys 4434BAB3
> gpg --keyserver subkeys.pgp.net --armor --export 4434BAB3
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
More information about the Programming
mailing list