William Stein wrote:
> 2009/6/13 Clint Whaley <wha...@cs.utsa.edu>:

>> The actual error you guys are showing below looks more like something
>> really odd happened during an install:  It is trying to choose a small
>> block factor, and has chosen 0.  Looking at the place the assertion
>> failed, its GuessSmallNB() in ATLAS/tune/blas/gemm/mmsearch.c,
>> which might freak out like this if mu or nu were chosen to be huge
>> values (the L1 is small, at 8K).  To track this down, I'd probably throw
>> in some print statements in GuessSmallNB() to see what part of the
>> computation is failing.
>>
>> If you just want to force it to continue, I think it'd be safe to simply
>> have the routine return(28); as the first statement . . .
> 
> Many thanks for that hint!
> 
> William
> 
>> Cheers,
>> Clint

Hi Clint, William, Casey and anyone else reading this!

I downloaded the ATLAS 3.8.3 source code and built it outside of Sage, 
so the following results are directly from your ATLAS source.

This was compiled on a Sun T5240 with 128 virtual processors running at 
1167 MHz.

I used all the GNU tools - gcc version 4.4.0, the GNU linker (version 
2.15), GNU assembler (version 2.15).

I stuck a few print statements as suggested (see my revised file below).

The outputs were:

Arguments passed to GuessSmallNB were: pre=d L1Size=8192 mu=6 nu=5

L1Size=1024 size=8 imult=30 nb=0

Printing nb for a second time, as it may have changed if it was less 
than 28. nb=0


I've not tried changing the code in sage yet so it returns 28. I'll do 
that before I go to bed and let it run (its 2326 here in the UK).

Dave

-----------

static int GuessSmallNB(char pre, int L1Size, int mu, int nu)
/*
  * Returns a small nb useful for in-cache timings
  */
{
    int imult, nb, size;
    printf("Arguments passed to GuessSmallNB were: pre=%c L1Size=%d 
mu=%d nu=%d\n",pre, L1Size, mu, nu);

    size = (pre == 'd' || pre == 'z') ? ATL_dsize : ATL_ssize;
    L1Size /= size;
    imult = Mylcm(mu, nu);
/*
  * Try to get a block factor where A, B & C all fit into cache
  */
    for (nb=imult; 3*nb*nb < L1Size; nb += imult);
    nb -= imult;
/*
  * If block to small, settle for fitting one block comfortably in cache
  */
    printf("L1Size=%d size=%d imult=%d nb=%d\n",L1Size, size,imult,nb);
    if (nb < 28)
    {
       for (; nb*nb+(mu+nu)*nb*2 < L1Size; nb += imult);
       nb -= imult;
    }
    printf("Printing nb for a second time, as it may have changed if it 
was less than 28. nb=%d\n",nb);
    fprintf(stderr, "L1Size=%d, pre=%c, Smallnb=%d\n", L1Size, pre, nb);
    assert(nb);
    return(nb);
}


--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to 
sage-devel-unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to