2011-06-18 26 views
12

Tôi đang cố gắng tìm hiểu về hiệu suất bộ nhớ cache CPU trong thế giới .NET. Cụ thể là tôi đang làm việc qua số article about Processor Cache Effects của Igor Ostovsky.Hiệu suất khi tạo CPU Cache Misses

Tôi đã trải qua ba ví dụ đầu tiên trong bài viết của mình và đã ghi lại các kết quả có sự khác biệt lớn với anh ấy. Tôi nghĩ rằng tôi phải làm điều gì đó sai vì hiệu suất trên máy tính của tôi cho thấy hầu hết các kết quả ngược lại chính xác của những gì anh ấy thể hiện trong bài viết của mình. Tôi không thấy những hiệu ứng lớn từ bộ nhớ cache mà tôi mong đợi.

Tôi đang làm gì sai? (Mã xấu, thiết lập trình biên dịch, vv)

Dưới đây là kết quả thực hiện trên máy tính của tôi:

enter image description here

enter image description here

enter image description here

Nếu nó giúp, bộ vi xử lý trên của tôi máy là một Intel Core i7-2630QM. Dưới đây là thông tin về bộ nhớ cache bộ xử lý của tôi:

enter image description here

tôi đã biên soạn trong chế độ x64 phát hành.

Dưới đây là mã nguồn của tôi:

class Program 
    { 

     static Stopwatch watch = new Stopwatch(); 

     static int[] arr = new int[64 * 1024 * 1024]; 

     static void Main(string[] args) 
     { 
      Example1(); 
      Example2(); 
      Example3(); 


      Console.ReadLine(); 
     } 

     static void Example1() 
     { 
      Console.WriteLine("Example 1:"); 

      // Loop 1 
      watch.Restart(); 
      for (int i = 0; i < arr.Length; i++) arr[i] *= 3; 
      watch.Stop(); 
      Console.WriteLine("  Loop 1: " + watch.ElapsedMilliseconds.ToString() + " ms"); 

      // Loop 2 
      watch.Restart(); 
      for (int i = 0; i < arr.Length; i += 32) arr[i] *= 3; 
      watch.Stop(); 
      Console.WriteLine("  Loop 2: " + watch.ElapsedMilliseconds.ToString() + " ms"); 

      Console.WriteLine(); 
     } 

     static void Example2() 
     { 

      Console.WriteLine("Example 2:"); 

      for (int k = 1; k <= 1024; k *= 2) 
      { 

       watch.Restart(); 
       for (int i = 0; i < arr.Length; i += k) arr[i] *= 3; 
       watch.Stop(); 
       Console.WriteLine("  K = "+ k + ": " + watch.ElapsedMilliseconds.ToString() + " ms"); 

      } 
      Console.WriteLine(); 
     } 

     static void Example3() 
     { 

      Console.WriteLine("Example 3:"); 

      for (int k = 1; k <= 1024*1024; k *= 2) 
      { 

       //256* 4bytes per 32 bit int * k = k Kilobytes 
       arr = new int[256*k]; 



       int steps = 64 * 1024 * 1024; // Arbitrary number of steps 
       int lengthMod = arr.Length - 1; 

       watch.Restart(); 
       for (int i = 0; i < steps; i++) 
       { 
        arr[(i * 16) & lengthMod]++; // (x & lengthMod) is equal to (x % arr.Length) 
       } 

       watch.Stop(); 
       Console.WriteLine("  Array size = " + arr.Length * 4 + " bytes: " + (int)(watch.Elapsed.TotalMilliseconds * 1000000.0/arr.Length) + " nanoseconds per element"); 

      } 
      Console.WriteLine(); 
     } 

    } 
+0

Bạn đang sử dụng CPU nào? Bộ nhớ cache có bao nhiêu bộ nhớ cache? Cấp 1 và 2? – Oded

+0

Đây là Intel Core i7-2630QM. Số liệu thống kê bộ nhớ cache nằm trong hình ảnh dòng lệnh ở trên. –

+0

Ngoài ra, bạn có đủ RAM trong hệ thống? Bạn không đập vào trang tệp trong khi thử nghiệm? –

Trả lời

3

Tại sao bạn đang sử dụng i + = 32 trong vòng lặp thứ hai. Bạn đang bước qua các dòng bộ nhớ cache theo cách này. 32 * 4 = 128bytes cách lớn hơn 64bytes cần thiết.

+1

... Tôi không hiểu câu trả lời này. Tại sao tài khoản đó lại khác biệt về độ lớn của đơn đặt hàng và điều đó có liên quan gì đến các thử nghiệm thứ hai hoặc thứ ba? –

+0

Ngay cả khi biết điều này là khá cũ, chỉ cần cho người khác tham khảo, các dòng bộ nhớ cache thường được lấy theo khối 64 byte, vì vậy những gì DiVan được hiển thị là trong một mảng ** int ** (4 byte), cho dù bạn đi qua nó Bước 32 bạn sẽ kết thúc nhảy qua nhiều hơn một dòng bộ nhớ cache, những gì tất nhiên sẽ làm cho vòng lặp 2 nhanh hơn, nếu bạn đang sử dụng 16 thay vì 32 (16x4 = 64), sau đó bạn sẽ không bỏ qua bất kỳ dòng bộ nhớ cache và vòng lặp 1 và 2 sẽ có kết quả tương tự, ngay cả vòng lặp 2 lặp lại ít hơn vòng lặp 1. – DenninDalke

Các vấn đề liên quan