You can use let scopes, but I'm not completely sure I understand how they 
work, but someone will correct me if this is wrong.

let stat_var = [1:10]
    global f
    function f(a)
        return a*stat_var
    end
end

Ivar

kl. 20:27:08 UTC+1 fredag 28. mars 2014 skrev Laszlo Hars følgende:
>
> Thank you guys. I couldn't imagine how many things could go wrong in a 
> computation session, under Windows. I rebooted my PC, and now the 
> benchmarks run 3 times faster (!), and I see no real differences in the 
> cases, except in the global context.
>
> I agree that annotating "pure" functions could be very useful for high 
> performance code.
>
> I miss STATIC variables, even more, though. My functions use a bunch of 
> small constant arrays, which I'd like to specify as static, loaded together 
> with the function code. Is there a way to do this? (Now I put my functions 
> into modules, where outside of the functions I write const array 
> definitions. Inside the functions these arrays are declared global. It 
> works, but I ended up with many small modules, and a lot of "using" 
> statements.)
>
>
> On Fri, Mar 28, 2014 at 12:09 PM, Stefan Karpinski 
> <ste...@karpinski.org<javascript:>
> > wrote:
>
>> Either way, one thing is quite unfortunate about this code. The 
>> compilation process isn't able to figure out that 10^8 is a constant so it 
>> recomputes it on every loop iteration. We really need a way to annotate 
>> functions as being pure in the very specific sense that the compiler is 
>> free to evaluate them at compile time if all of its arguments are known at 
>> compile time (or partially evaluate if when some of the arguments are 
>> known).
>>  
>>
>> On Fri, Mar 28, 2014 at 11:24 AM, John Myles White 
>> <johnmyl...@gmail.com<javascript:>
>> > wrote:
>>
>>> Yeah, that's true. I didn't read the IR carefully enough.
>>>
>>> Laszlo, are you on the latest Julia? I worry that it's hard to make 
>>> comparisons if you're running an older version of Julia.
>>>
>>>  -- John
>>>
>>> On Mar 28, 2014, at 8:18 AM, Stefan Karpinski 
>>> <ste...@karpinski.org<javascript:>> 
>>> wrote:
>>>
>>> Perhaps I should have said "isomorphic" – the only differences there are 
>>> names. It's more obvious that the native code is the same – only the source 
>>> line annotations are different at all.
>>>
>>>
>>> On Fri, Mar 28, 2014 at 11:16 AM, John Myles White 
>>> <johnmyl...@gmail.com<javascript:>
>>> > wrote:
>>>
>>>> On my system, the two functions produce different LLVM IR:
>>>>
>>>> julia> code_llvm(f1, ())
>>>>
>>>> define i64 @julia_f115727() {
>>>> top:
>>>>   %0 = call i64 @julia_power_by_squaring1373(i64 10, i64 8), !dbg !726
>>>>   %1 = icmp slt i64 %0, 1, !dbg !726
>>>>   br i1 %1, label %L2, label %if, !dbg !726
>>>>
>>>> if:                                               ; preds = %top, %if
>>>>   %j.04 = phi i64 [ %3, %if ], [ 1, %top ]
>>>>   %k.03 = phi i64 [ %4, %if ], [ 1, %top ]
>>>>   %2 = and i64 %k.03, 1, !dbg !727
>>>>   %3 = add i64 %j.04, %2, !dbg !727
>>>>   %4 = add i64 %k.03, 1, !dbg !728
>>>>   %5 = call i64 @julia_power_by_squaring1373(i64 10, i64 8), !dbg !726
>>>>   %6 = icmp sgt i64 %4, %5, !dbg !726
>>>>   br i1 %6, label %L2, label %if, !dbg !726
>>>>
>>>> L2:                                               ; preds = %if, %top
>>>>   %j.0.lcssa = phi i64 [ 1, %top ], [ %3, %if ]
>>>>   ret i64 %j.0.lcssa, !dbg !729
>>>> }
>>>>
>>>> julia> code_llvm(f2, ())
>>>>
>>>> define i64 @julia_f215728() {
>>>> top:
>>>>   %0 = call i64 @julia_power_by_squaring1373(i64 10, i64 8), !dbg !729
>>>>   %1 = icmp slt i64 %0, 1, !dbg !729
>>>>   br i1 %1, label %L6, label %L3, !dbg !729
>>>>
>>>> L3:                                               ; preds = %top, %L3
>>>>   %j.08 = phi i64 [ %3, %L3 ], [ 1, %top ]
>>>>   %k.07 = phi i64 [ %4, %L3 ], [ 1, %top ]
>>>>   %2 = and i64 %k.07, 1, !dbg !730
>>>>   %3 = add i64 %j.08, %2, !dbg !730
>>>>   %4 = add i64 %k.07, 1, !dbg !731
>>>>   %5 = call i64 @julia_power_by_squaring1373(i64 10, i64 8), !dbg !729
>>>>   %6 = icmp slt i64 %5, %4, !dbg !729
>>>>   br i1 %6, label %L6, label %L3, !dbg !729
>>>>
>>>> L6:                                               ; preds = %L3, %top
>>>>   %j.0.lcssa = phi i64 [ 1, %top ], [ %3, %L3 ]
>>>>   ret i64 %j.0.lcssa, !dbg !732
>>>> }
>>>>
>>>> But the performance is identical or slightly in favor of f1.
>>>>
>>>>  -- John
>>>>
>>>> On Mar 28, 2014, at 8:02 AM, Stefan Karpinski 
>>>> <ste...@karpinski.org<javascript:>> 
>>>> wrote:
>>>>
>>>> > Both way of writing a while loop should be the same. If you're seeing 
>>>> a difference, something else is going on. I'm not able to reproduce this:
>>>> >
>>>> > function f1()
>>>> >   j = k = 1
>>>> >   while k <= 10^8
>>>> >     j += k & 1
>>>> >     k += 1
>>>> >   end
>>>> >   return j
>>>> > end
>>>> >
>>>> > function f2()
>>>> >   j = k = 1
>>>> >   while true
>>>> >     k <= 10^8 || break
>>>> >     j += k & 1
>>>> >     k += 1
>>>> >   end
>>>> >   return j
>>>> > end
>>>> >
>>>> > function f3()
>>>> >   j = k = 1
>>>> >   while true
>>>> >     k > 10^8 && break
>>>> >     j += k & 1
>>>> >     k += 1
>>>> >   end
>>>> >   return j
>>>> > end
>>>> >
>>>> > julia> @time f1()
>>>> > elapsed time: 0.644661304 seconds (64 bytes allocated)
>>>> > 50000001
>>>> >
>>>> > julia> @time f2()
>>>> > elapsed time: 0.640951585 seconds (64 bytes allocated)
>>>> > 50000001
>>>> >
>>>> > julia> @time f3()
>>>> > elapsed time: 0.639177183 seconds (64 bytes allocated)
>>>> > 50000001
>>>> >
>>>> > All three functions produce identical native code. Can you send 
>>>> exactly what your function definitions are, how you're timing them and 
>>>> perhaps the output of code_native(f1,())?
>>>> >
>>>> >
>>>> > On Fri, Mar 28, 2014 at 10:48 AM, Laszlo Hars 
>>>> > <laszl...@gmail.com<javascript:>> 
>>>> wrote:
>>>> > Thanks, John, for your replies. In my system your code gives reliable 
>>>> results, too, if we increase the loop limits to 10^9:
>>>> >
>>>> > julia> mean(t1s ./ t2s)
>>>> > 11.924373323658703
>>>> >
>>>> > This 12% makes a significant difference in my function of nested 
>>>> loops (could add up to a factor of 2 slow down). So, the question remains:
>>>> >
>>>> > - what is the fastest coding of a while loop?
>>>> >
>>>>
>>>>
>>>
>>>
>>
>

Reply via email to