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 -~----------~----~----~----~------~----~------~--~---