Tôi đang cố gắng để tối ưu hóa một số ++ mã RK4 GCC C bằng cách sử dụng__builtin_prefetch, Số tiền đọc được bao nhiêu?
__builtin_prefetch
Tôi đang gặp một số rắc rối cố gắng tìm ra cách để prefetch cả lớp. Tôi không hiểu số lượng của const void *addr
được đọc. Vì vậy, tôi có các giá trị tiếp theo là from
và to
được tải.
for (int i = from; i < to; i++)
{
double kv = myLinks[i].kv;
particle* from = con[i].Pfrom;
particle* to = con[i].Pto;
//Prefetch values at con[i++].Pfrom & con[i].Pto;
double pos = to->px- from->px;
double delta = from->r + to->r - pos;
double k1 = axcel(kv, delta, from->mass) * dt; //axcel is an inlined function
double k2 = axcel(kv, delta + 0.5 * k1, from->mass) * dt;
double k3 = axcel(kv, delta + 0.5 * k2, from->mass) * dt;
double k4 = axcel(kv, delta + k3, from->mass) * dt;
#define likely(x) __builtin_expect((x),1)
if (likely(!from->bc))
{
from->x += ((k1 + 2 * k2 + 2 * k3 + k4)/6);
}
}
Link: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/
Tôi không nghĩ có nhiều điểm trong việc tối ưu hóa vi mô như vậy, ngoài mục đích học tập. CPus hiện đại là rất tốt tại prefetching của mình. – ronag
Có lẽ, nhưng tôi có 1 chức năng gọi là gần 1 tỷ lần. – Mikhail