From rf11@rncmm2.urz.tu-dresden.de Sat Jun 23 11:58:26 2001 Return-Path: Delivered-To: leitner-fefe-web@fefe.de Received: (qmail 18980 invoked from network); 23 Jun 2001 09:58:26 -0000 Received: from rncmm2.urz.tu-dresden.de (141.30.67.222) by fefe.de with SMTP; 23 Jun 2001 09:58:26 -0000 Received: (from rf11@localhost) by rncmm2.urz.tu-dresden.de (8.10.2+Sun/8.10.2) id f5N9w8g00870 for web@fefe.de; Sat, 23 Jun 2001 11:58:08 +0200 (MET DST) Date: Sat, 23 Jun 2001 11:58:08 +0200 From: Reinhard Foerster To: web@fefe.de Subject: zu deinem Cache Beispiel Message-ID: <20010623115808.A795@rncmm2.urz.tu-dresden.de> Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit Status: RO X-Status: A Content-Length: 4581 Hallo Felix, ich habe in den letzten Tagen ziemlich viel von www.fefe.de genossen und dabei einige nette Sachen hinsichtlich Optimierung aufgeschnappt. Kompliment und Dank erstmal dafür Bei http://www.fefe.de/devel/cacheassoc.txt hat mich zielich gewundert, daß es mit den größeren Arrays "nur" 30% schneller wird. Also habe ich mal ein bisschen rumprobiert: Athlon Thunderbird 900 Mhz (ich glaube den nimmst du auch, auf einer anderen Seite stand IMO was von Athlon 900) 1st lvl dcache 64k 2-way associative 2nd lvl d+icache 265k 16-way associative alle Meßwerte sind über 10 Versuche gemittelt Erstmal fällt auf, daß die Meßwerte mit deinem Programm recht stark schwanken. Das dürfte daran liegen, daß es pro Lauf viele - aber recht unterschiedlich viele - misses im lvl 2 cache gibt. Diese kommen aber kaum daher, das sich in der inner loop die Abschnitte der 3 Arrays gegenseitig aus dem 2nd lvl Cache werfen weil sie die "gleiche Adresse" für die cache line haben. Ein 16-wege assoz. Cache hat mit lediglich 3 cache lines mit "gleicher Adresse" absolut kein Problem. Das working set mit den 3 arrays a 128k ist insgesamt ein bisschen gross für die Caches (insgesamt maximal 320k dache) und so muß recht oft auf den Hauptspeicher gewartet werden. Hier nochmal dein Test. Das Programm ist minimal verändert (mehr Runden, 2 neuen defines) COMP soll für COMPuted size stehen - naja. #define SIZE 16400 #define COMP 16384 #define ROUNDS 3000 double a[SIZE], b[SIZE], c[SIZE]; void mpy(double *a,double *b,double *c,int n) { int i; for (i=0; i