core dump ในขณะที่วนซ้ำผ่านอาร์เรย์

ฉันมีปัญหากับรหัสต่อไปนี้ newrows เป็นพารามิเตอร์ที่กำหนดให้กับฟังก์ชันที่ฉันกำลังทำงานอยู่โดยตรง องค์ประกอบต่างๆ กำลังถูกคำนวณเร็วขึ้นเล็กน้อยโดยใช้พารามิเตอร์อื่น อย่างไรก็ตาม สำหรับการรวมค่าสำหรับแถวใหม่และองค์ประกอบต่างๆ เข้าด้วยกัน ฉันจะได้รับคอร์ดัมพ์ ในขณะที่ชุดค่าผสมอื่นๆ ทำงานได้ดี โดยปกติ เมื่อคอร์ดัมพ์เกิดขึ้น จะมีการวนซ้ำ 20,000 ถึง 25,000 ครั้ง อย่างไรก็ตาม เมื่อทุกอย่างทำงานได้ดี มีการวนซ้ำถึง 40,000 ครั้ง

int32_t newimage[newrows][elements][3];
    int32_t pixelcounter[newrows][elements];

    //int32_t norm, angle, rohmax;
    //double r, alpha, beta, m, mu;



    //initialize arrays

    for(i=0; i<newrows; i++){
        for(j=0; j<elements; j++){
            pixelcounter[i][j] = 0;
            newimage[i][j][0] = 0;
            newimage[i][j][1] = 0;
            newimage[i][j][2] = 0;

        }
    }

ชุดค่าผสมที่ทำงานได้ดี: 200 : 188

การรวมกันที่นำไปสู่การถ่ายโอนข้อมูลหลัก: 200 : 376

ฉันใช้ linux btw :-)


person user3224065    schedule 22.01.2014    source แหล่งที่มา


คำตอบ (1)


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

#bytes = newrows * elemets * 3

ฉันทำความสะอาดโปรแกรมของคุณแล้ว (คำแนะนำที่ดีคือลองนำเสนอโปรแกรมที่คอมไพล์ เพื่อให้ผู้อื่นสามารถช่วยเหลือคุณได้เร็วขึ้น!):

#include <stdio.h>
#include <stdint.h>

void test(size_t newrows, size_t elements) {
    int32_t newimage[newrows][elements][3];
    int32_t pixelcounter[newrows][elements];

    //initialize arrays

    for(size_t i=0; i<newrows; i++) {
        for(size_t j=0; j<elements; j++) {
            pixelcounter[i][j] = 0;
            newimage[i][j][0] = 0;
            newimage[i][j][1] = 0;
            newimage[i][j][2] = 0;
        }
    }
}

int main(void) {
    printf("Size of integer = %ld\n", sizeof(int));
    for (size_t i = 700; ; i += 10) {
            printf("Testing (%ld, %ld)\n", i, i);
            test(i, i);
    }
    return 0;
}

และเรียกใช้สิ่งนี้ ฉันเห็น:

Size of integer = 4
Testing (700, 700)
Testing (710, 710)
Testing (720, 720)
Testing (730, 730)
[3]    13482 segmentation fault (core dumped)  ./a.out

ดังนั้นที่ไหนสักแห่งระหว่าง 720^2 * 3 * 4 ถึง 730^2 * 3 * 4 ไบต์ ซึ่งประมาณ 6 MiB บนคอมพิวเตอร์ Linux 64 บิตของฉัน มันอาจจะแตกต่างออกไปในคอมพิวเตอร์ของคุณ

วิธีแก้ปัญหาในกรณีนี้คือการจัดสรรอาร์เรย์ของคุณบนฮีป ซึ่งคุณจะมีหน่วยความจำมากขึ้นในการทำงานด้วย ข้อมูลเพิ่มเติมเกี่ยวกับการจัดสรรอาร์เรย์หลายมิติแบบฮีปสามารถพบได้ใน C จัดสรรพื้นที่สำหรับอาร์เรย์ 2D (3D...) อย่างไรเมื่อใช้ malloc

person Charles    schedule 02.02.2014