ฉันกำลังพยายามสร้างโปรไฟล์โค้ด C บางส่วน แต่หนึ่งในฟังก์ชันที่มีค่าใช้จ่ายสูงที่สุดไม่ปรากฏในเอาต์พุต GProf
int main() {
initialise...
haloSwap();
for(...) {
functions...
propagate();
functions...
}
}
void propagate() {
for (x)
for (y)
for (z)
grid[xNew][yNew][zNew] = grid[x][y][z];
haloSwap();
}
void haloSwap() {
// Horizontal swap
create buffers...
MPI_Sendrecv(buffers);
recreate grid from buffers...
// Vertical swap
create buffers...
MPI_Sendrecv(buffers);
recreate grid from buffers...
}
หวังว่ารหัสหลอกนั้นจะช่วยอธิบายการตั้งค่าได้ haloSwap()
เกี่ยวข้องกับการสื่อสารจำนวนมากระหว่างเธรด และฉันรู้สึกว่ามันเป็นส่วนที่มีราคาแพงของอัลกอริทึม มันถูกเรียกระหว่างการเริ่มต้นและซ้ำแล้วซ้ำอีกระหว่างการวนซ้ำของอัลกอริธึม
GProf แสดงการเรียก haloSwap
เพียง 1 ครั้ง (ระหว่างเริ่มต้น) แม้ว่าฉันรู้ว่ามันถูกเรียกมากกว่า 1,000 ครั้งจากภายใน propagate()
propagate()
แสดงเป็นส่วนที่แพงที่สุดของโค้ด แต่ฉันต้องการทราบว่าเป็นส่วน xyz loop หรือ MPI comminucation
ไม่มีใครรู้ว่าเหตุใดการโทรถึง haloSwap
จาก propagate
จึงถูกละเลยทั้งจำนวนการโทรและเวลาที่ใช้ในฟังก์ชัน
haloSwap
ถูกกำหนดไว้ภายในไฟล์ .c อื่น ซึ่งอาจเป็นปัจจัยหรือไม่
หากฉันย้ายการโทรของ haloSwap
ไปยังลูปหลักหลังจากโทร propagate
(แทนที่จะอยู่ข้างใน) GProf จะยังคงแสดงการโทร 1 ครั้งเท่านั้น
propagate()
จบลงด้วยการอินไลน์ บอกคอมไพเลอร์ของคุณว่าอย่าใช้ฟังก์ชันแบบอินไลน์ ตัวอย่างเช่น สำหรับ GCC ตัวเลือกคือ-fno-inline
- person Hristo Iliev   schedule 19.08.2016