ฟังก์ชันหายไปจากเอาต์พุต GProf

ฉันกำลังพยายามสร้างโปรไฟล์โค้ด 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 ครั้งเท่านั้น


person Kallum Burgin    schedule 19.08.2016    source แหล่งที่มา
comment
คุณอาจคอมไพล์ด้วยการเพิ่มประสิทธิภาพและ propagate() จบลงด้วยการอินไลน์ บอกคอมไพเลอร์ของคุณว่าอย่าใช้ฟังก์ชันแบบอินไลน์ ตัวอย่างเช่น สำหรับ GCC ตัวเลือกคือ -fno-inline   -  person Hristo Iliev    schedule 19.08.2016
comment
เพิ่มความคิดเห็น @Hristo_Iliev mpicc (จาก MPICH )wrapper ใช้การเพิ่มประสิทธิภาพ -O2 ซึ่งรวมถึงแฟล็ก -finline-small-functions หากมีฟังก์ชันที่คุณต้องการแยกออกจากการเพิ่มประสิทธิภาพใดๆ ให้ใช้แอตทริบิวต์ gcc ในฟังก์ชันต่างๆ เช่น void haloSwap() __attribute__(optimize(-O0))   -  person Angelos    schedule 19.08.2016
comment
หากคุณใช้ MPI แสดงว่ากำลังทำ I/O และเป็นที่รู้กันว่า gprof มองไม่เห็นสิ่งนั้น เนื่องจากการสุ่มตัวอย่างถูกระงับระหว่าง I/O คุณอาจใช้เวลา 99% ใน I/O แต่ gprof จะไม่แสดง เช่นเดียวกับอะไรก็ตามที่เรียกตัวเองว่า CPU Profiler   -  person Mike Dunlavey    schedule 25.08.2016
comment
@ MikeDunlavey ฉันคิดว่าวิธีของคนยากจนในการทำความเข้าใจนั่นคือการตรวจสอบเวลาที่ผ่านไปจริงเทียบกับเวลา CPU ที่รายงานของ gprof   -  person Kallum Burgin    schedule 26.08.2016
comment
@KallumBurgin: นั่นจะแสดงปัญหา บางคนใช้เทคนิคนี้ ซึ่งทำงานแบบเรียลไทม์ ไม่ใช่แค่เวลา CPU มีความแม่นยำในการกำหนดเวลาน้อยกว่า แต่มีความแม่นยำมากขึ้นในการระบุปัญหา   -  person Mike Dunlavey    schedule 26.08.2016


คำตอบ (2)


การทำโปรไฟล์โดยเปิดใช้งานการเพิ่มประสิทธิภาพไม่ใช่ความผิดพลาดที่โง่เขลาอย่างแน่นอน แต่เป็นวิธีที่ ควร โปรไฟล์แทน ไม่เช่นนั้นคุณจะเสียเวลาและความพยายามในการปรับแต่งรูทีนด้วยมือที่คอมไพเลอร์อาจแก้ไขให้คุณได้

หากคุณต้องการรายงานโปรไฟล์ที่แตกต่างจากที่ gprof มีให้ เครื่องมือประสิทธิภาพของ Google (หรือที่เรียกว่า gperftools) อาจเป็น มีประโยชน์กับคุณ รายงานจะบันทึกเวลาที่ใช้ในฟังก์ชันอินไลน์ ต่อไปนี้เป็นรายงานตัวอย่างที่คุณสามารถดูได้ว่าเครื่องมือของ Google รายงานฟังก์ชันแบบอินไลน์อย่างไร:

% ~/soft/gperftools/bin/pprof --text \
    bigio_mpi bigio-profiling/prof-ca-fill-inline1-0.out| head -10
Using local file bigio_mpi.
Using local file bigio-profiling/prof-ca-fill-inline1-0.out.
Total: 29680 samples
10837  36.5%  36.5%    24056  81.1% ADIOI_P2PContigReadAggregation
3534  11.9%  48.4%     3534  11.9% _init@3a858
2954  10.0%  58.4%     2954  10.0% unshuffle_sse2
2448   8.2%  66.6%     2448   8.2% __memcpy_ssse3
1742   5.9%  72.5%     2661   9.0% type_create_contiguous_x (inline)
1373   4.6%  77.1%     1373   4.6% shuffle_sse2
1176   4.0%  81.1%     6205  20.9% ADIOI_Type_create_hindexed_x
1104   3.7%  84.8%    19082  64.3% ADIOI_Get_eof_offset
831   2.8%  87.6%    28184  95.0% ADIOI_Flatten
person Rob Latham    schedule 25.08.2016
comment
ฉันต้องการข้อมูลเกี่ยวกับฟังก์ชันเฉพาะที่กำลังอยู่ในบรรทัด ซึ่งฉันไม่ได้สนใจ - person Kallum Burgin; 26.08.2016

@Hristo_Iliev และ @Angelos ถูกต้อง ฉันกำลังรวบรวมด้วยการเพิ่มประสิทธิภาพและปัญหาของฉันก็แก้ไขได้ด้วยการคอมไพล์ด้วย -O0 ความผิดพลาดโง่ๆ ฉันแน่ใจว่าฉันเคยทำมันมาก่อน

person Kallum Burgin    schedule 25.08.2016