On 24 February 2015 at 14:33, Milan Bouchet-Valat <[email protected]> wrote:

> Le mardi 24 février 2015 à 05:25 -0800, Bill Hart a écrit :
> > In answer to your original question, assuming you had a very complex C
> > program that Julia just didn't handle efficiently (it's possible), or
> > you had already written a very large external library which you didn't
> > want to rewrite in Julia, and someone else hasn't already written an
> > interface to it from Julia....
> >
> >
> > First you want to make a shared library. For this you can use gcc.
> > First compile your C file to an object file with the -c option. Then
> > link your object file to make a shared library with the -shared
> > option. This will make a shared library (.so or .dll or .dylib,
> > depending on what operating system you have).
> >
> >
> > It's the .so or .dll or .dylib file that Julia wants to be able to
> > find, not the C file.
> >
> >
> > So long as your shared library has no other dependencies, you can set
> > Julia's DL_LOAD_PATH to specify the location of the shared library
> > (I'm not sure if this is considered best practice or not).
> >
> >
> > Otherwise, on most systems the dynamic linker has various places it
> > will look for your library. This depends on your system though, so it
> > varies between Unix, Linux, Windows and OSX.
> This should work, but I think the "best practice" if you need to make
> your code public at some point is to use BinDeps, as explained in the
> thread I linked to. Though if you're the only one to work on it, a few
> hacks to build and locate the library might be enough.
>

It depends on a lot of things. For example, locally, people are getting
very excited about hashdist. So persuading them to use BinDeps may be
somewhat difficult.

For the time being I have persuaded them to support both (when we finally
get around to packaging). But if hashdist goes on in leaps and bounds,
people will want to use that instead.


>
>
> Regards
>
> > On Tuesday, 24 February 2015 14:10:31 UTC+1, Bill Hart wrote:
> >         One important thing to note is that if you do a + b at the top
> >         level, it won't be fast.
> >
> >
> >         But as soon as you do a + b inside a function, it will be as
> >         fast as C.
> >
> >         For example
> >
> >
> >         a = 20
> >         b = 10
> >         for i = 1:1000000000
> >            c = a + b
> >         end
> >
> >
> >         takes about 34s
> >
> >
> >         But the following is almost instantaneous:
> >
> >
> >         function doit()
> >            a = 20
> >            b = 10
> >            for i = 1:1000000000
> >               c = a + b
> >            end
> >         end
> >
> >
> >         doit()
> >
> >
> >         On Tuesday, 24 February 2015 14:03:07 UTC+1, Tim Holy wrote:
> >                 Giovanni,
> >
> >                 Before you start going to that kind of effort, take a
> >                 look at
> >
> >                 julia> @code_native 3+5
> >                         .text
> >                 Filename: int.jl
> >                 Source line: 12
> >                         push    RBP
> >                         mov     RBP, RSP
> >                 Source line: 12
> >                         add     RDI, RSI
> >                         mov     RAX, RDI
> >                         pop     RBP
> >                         ret
> >
> >                 I think you're going to have a pretty hard time
> >                 finding a C compiler that does
> >                 better than this :-). Especially since it gets inlined
> >                 at the call site.
> >
> >                 Best,
> >                 --Tim
> >
> >                 On Tuesday, February 24, 2015 01:13:52 AM
> >                 [email protected] wrote:
> >                 > Hello,
> >                 >
> >                 > I am a beginner to Julia and would like to try out
> >                 some features. I would
> >                 > like to improve performances of some bottleneck
> >                 functions by translating
> >                 > them into C.
> >                 > A simple example is :
> >                 > main.jl
> >                 >
> >                 > a ::Int64 = 20
> >                 > b ::Int64 = 10
> >                 > ccall(:do_sum, Int64, (Int64, Int64), a, b)
> >                 >
> >                 >
> >                 >
> >                 > test.c
> >                 > #include <stdio.h>
> >                 >
> >                 > int do_sum (int a,int b)
> >                 > {
> >                 > int c;
> >                 > c = a+b;
> >                 > printf("f\n:",c);
> >                 > return c;
> >                 > }
> >                 >
> >                 > where should I put the C file ?
> >                 >
> >                 > Thanks,
> >                 > G.
> >
>
>

Reply via email to