Tôi cần đọc một lượng lớn dữ liệu vào bộ đệm (khoảng 20gig). Tôi có 192gb DDram rất nhanh, vì vậy không có vấn đề với kích thước bộ nhớ. Tuy nhiên, tôi thấy rằng các mã sau chạy chậm hơn và chậm hơn nữa nó được vào bộ đệm. Trình lược tả Visual C cho tôi biết rằng 68% thời gian thực hiện 12 phút là trong 2 câu lệnh bên trong vòng lặp trong myFunc(). Tôi đang chạy win7, 64bit trên một dell rất nhanh với 2 cpu, 6 lõi vật lý mỗi (24 lõi logic), và tất cả 24 lõi là hoàn toàn maxed trong khi chạy này.Vấn đề tốc độ với mảng C lớn sử dụng 64bit Visual C
#define TREAM_COUNT 9000
#define ARRAY_SIZE ONE_BILLION
#define offSet(a,b,c,d) (((size_t) ARRAY_SIZE * (a)) + ((size_t) TREAM_COUNT * 800 * (b)) + ((size_t) 800 * (c)) + (d))
void myFunc(int dogex, int ptxIndex, int xtreamIndex, int carIndex)
{
short *ptx = (short *) calloc(ARRAY_SIZE * 20, sizeof(short));
#pragma omp parallel for
for (int bIndex = 0; bIndex < 800; ++bIndex)
doWork(dogex, ptxIndex, carIndex);
}
void doWork(int dogex, int ptxIndex, int carIndex)
{
for (int treamIndex = 0; treamIndex < ONE_BILLION; ++treamIndex)
{
short ptxValue = ptx[ offSet(dogex, ptxIndex, treamIndex, carIndex) ];
short lastPtxValue = ptx[ offSet(dogex, ptxIndex-1, treamIndex, carIndex) ];
// ....
}
}
Bạn có thể tối ưu hóa mã bằng cách loại bỏ các phép nhân (bằng cách dịch chuyển hoặc bổ sung). Nhưng vẫn có thể không giải quyết vấn đề của bạn của vòng lặp nhận được chậm hơn. – thumbmunkeys
Tại sao bạn chỉ định ptxValue và lastPtxValue trong vòng lặp? Cả hai bài tập dường như độc lập với vòng lặp. – ArjunShankar
Lời xin lỗi của tôi ... khi cố gắng đơn giản hóa mã, tôi hiểu sai (phiên bản đã chỉnh sửa ở trên). Bên trong vòng lặp 'for' có một giá trị thay đổi, đó là lý do tại sao các calcs cần phải được thực hiện hơn và hơn nữa. – PaeneInsula