2012-10-21 28 views
6

Vì vậy, tôi đã làm một số bài kiểm tra điểm chuẩn với chủ đề và tôi đã viết các đoạn mã sau:Mã nối tiếp chậm hơn nhiều so với chỉ sử dụng một luồng trong C?

resp_threadless [] and resp_threaded [] là mảng int toàn cục và kích thước của chúng là n;

int n = 100000; 

void function() { 
    for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

DWORD WINAPI function_th(LPVOID lpParam) { 
for (long j = 0; j < n; ++j) { 
    int count = 0; 
    double x = vetor[j]; 
     while (x > 1.0) { 
     x = sqrt(x); 
     ++count; 
    } 
    resp_threadless[j] = count; 
    } 
} 

tôi benchmarked chức năng đầu tiên bằng cách chỉ gọi cô:

function(); 

Và thứ hai như thế này:

HANDLE hThreadArray[1]; 
DWORD dwThreads[1]; 
hThreadArray[0] = CreateThread(NULL, 0, function_th, NULL , 0, &(dwThreads[0])); 
WaitForMultipleObjects(1, hThreadArray, TRUE, INFINITE); 
CloseHandle(hThreadArray[0]); 

Hãy ghi nhớ rằng tôi biết rằng gọi nhiều chủ đề sử dụng function_th() sẽ không song song nó, đây chỉ là một thử nghiệm bởi vì tôi đã có kết quả thực sự kỳ lạ, vì vậy tôi quyết định xem điều gì sẽ xảy ra với một luồng và một hàm sử dụng mã SAME.

Tôi đã thử nghiệm này trong Intel Atom N270 và cửa sổ XP với NUMPROC = 1.

Kết quả: đang nối tiếp: 1485 ms Một Chủ đề: 425 ms

Tôi đã có kết quả tương tự sử dụng máy đa xử lý, và thậm chí với mã sử dụng các ẩn dụ để song song công việc được thực hiện bởi các luồng.

Có ai có ý tưởng về những gì có thể xảy ra không?

EDIT

Đảo ngược thứ tự, chạy nhiều lần mỗi người, vv ... -> Không có thay đổi

cao hơn N -> Chủ đề ai là tương thậm chí nhanh hơn

Sử dụng QueryPerformanceCounter () -> Không thay đổi

Chi phí tạo chủ đề -> Nên làm cho luồng thậm chí còn chậm hơn, không nhanh hơn

Mã gốc: http://pastebin.com/tgmp5p1G

+0

Có thể luồng hiện tại của bạn (trong đó bạn gọi hàm '()') có mức độ ưu tiên thấp? – SomeWittyUsername

+2

Bạn có chạy hai lần kiểm tra tuần tự trong một lần thực thi chương trình không? Tôi nghi ngờ hiệu ứng bộ nhớ cache dữ liệu cho truy cập 'vetor []'. – yohjp

+0

1. Bạn đã thử đảo ngược thứ tự, chuỗi đầu tiên và chức năng sau? (hiệu ứng bộ nhớ cache) 2. Bạn đo thời gian như thế nào? – Arno

Trả lời

2

Đó là một vấn đề cache hit. Tôi nghi ngờ bạn đã làm điểm chuẩn theo thứ tự bạn mô tả nó trong câu hỏi của bạn. Hàm này được gọi là đầu tiên và luồng được gọi sau. Khi bạn điểm chuẩn chi tiết hơn, bạn sẽ quan sát lý do: Dữ liệu (sqrt) có sẵn trong bộ nhớ cache, do đó mã sẽ thực thi nhanh hơn nhiều. Test để proove:

  1. Chạy function() gấp đôi hoặc thậm chí thường xuyên hơn trước khi gọi các chủ đề. Cuộc gọi thứ hai hoạt động sẽ cho kết quả nhanh hơn.
  2. Gọi chủ đề trước chức năng và kết quả của bạn sẽ hiển thị ngược lại. Chức năng sẽ hiển thị kết quả tốt hơn.

Lý do: Tất cả phép tính sqrt (hoặc ít nhất là nhiều) đều có sẵn trong bộ nhớ cache và không phải tính toán lại. Nhanh hơn rất nhiều.

+0

Tôi đã thử đảo ngược khác, chạy nhiều lần cả hai người trong số họ, và tôi đã có kết quả tương tự. – ruback

+0

Vâng, tôi đã sử dụng mã của bạn và đã exacly đó. Và kết quả khá rõ ràng. ** Một lần nữa: ** Bạn đã đo thời gian như thế nào? Bạn có thể báo cáo thời gian để nói 5 lần chạy liên tục của hàm '() 'và' hàm_th() '? – Arno

+0

Tôi thực sự chạy 5 lần mỗi chức năng và nhận được giá trị trung bình. Tôi đang đo thời gian nhận được "(đôi) đồng hồ()/CLOCKS_PER_SEC;" và trừ cái kia. – ruback

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