Код не выполняется при компиляции с этими флагами - PullRequest
1 голос
/ 04 октября 2011

Мой код пытается найти энтропию сигнала (хранится в «data» и «interframe» - в полном коде они будут содержать сигнал, здесь я только что добавил некоторые случайные значения).Когда я компилирую с помощью 'gcc temp.c', он компилируется и работает нормально.Вывод:

entropy: 40.174477
features: 0022FD06
features[0]: 40
entropy: 40

Но когда я компилирую с помощью 'gcc -mstackrealign -msse -Os -ftree-vectorize temp.c', он компилируется, но не может выполняться за пределами строки 48. Ему нужно иметь все четырефлаги, чтобы потерпеть неудачу - любые три из них, и он работает нормально.

Код, вероятно, выглядит странно - я вырезал только ошибочные биты из гораздо большей программы.У меня есть только самое туманное представление о том, что делают флаги компилятора, кто-то еще их вставил (и обычно их больше, но я понял, что это были плохие).

Все помогают, высоко ценятся!

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

static void calc_entropy(volatile int16_t *features, const int16_t* data,
const int16_t* interframe, int frame_length);


int main()
{
    int frame_length = 128;
    int16_t data[128] = {1, 2, 3, 4};
    int16_t interframe[128] = {1, 1, 1};

    int16_t a = 0;
    int16_t* features = &a;

    calc_entropy(features, data, interframe, frame_length);
    features += 1;

    fprintf(stderr, "\nentropy: %d", a);

    return 0;
}

static void calc_entropy(volatile int16_t *features, const int16_t* data,
const int16_t* interframe, int frame_length)
{
    float histo[65536] = {0};
    float* histo_zero = histo + 32768;
    volatile float entropy = 0.0f;
    int i;

    for(i=0; i<frame_length; i++){
        histo_zero[data[i]]++;
        histo_zero[interframe[i]]++;
    }

    for(i=-32768; i < 32768; i++){
        if(histo_zero[i])
            entropy -= histo_zero[i]*logf(histo_zero[i]/(float)(frame_length*2));
    }

    fprintf(stderr, "\nentropy: %f", entropy);

    fprintf(stderr, "\nfeatures: %p", features);
    features[0] = entropy; //execution fails here
    fprintf(stderr, "\nfeatures[0]: %d", features[0]);
}

Редактировать: я использую gcc 4.5.2, с архитектурой x86.Кроме того, если я компилирую и запускаю его на VirtualBox, работающем под управлением ubuntu (gcc -lm -mstackrealign -msse -Os -ftree-vectorize temp.c), оно выполняется правильно.

Edit2: получаю

entropy: 40.174477
features: 00000000

, а затем сообщение из окна, сообщающее, что программа прекратила работу.

Edit3: За пять месяцев с тех пор, как я впервые опубликовал вопрос, я обновил его до gcc 4.7.0, и теперь кодработает нормально.Я вернулся к gcc 4.5.2, и это не удалось.Все еще не знаю почему!

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

Кажется, он работает и здесь, и единственное, что я вижу, может показаться странным, что вы берете 16-битное значение (features [0]) и конвертируете 32-битное число с плавающей точкой (энтропия)

features[0] = entropy; //execution fails here

в это значение, которое, конечно, будет сбрить его.

Это не должно иметь значения, но, черт возьми, посмотрите, имеет ли это какое-то значение, если вы измените значения int16_t на значения int32_t.

0 голосов
/ 04 октября 2011
ottavio@magritte:/tmp$ gcc x.c -o x -lm -mstackrealign -msse -Os -ftree-vectorize
ottavio@magritte:/tmp$ ./x 

entropy: 40.174477
features: 0x7fff5fe151ce
features[0]: 40
entropy: 40
ottavio@magritte;/tmp$ gcc x.c -o x -lm
ottavio@magritte:/tmp$ ./x 

entropy: 40.174477
features: 0x7fffd7eff73e
features[0]: 40
entropy: 40
ottavio@magritte:/tmp$

Итак, что с ним не так? Архитектура gcc 4.6.1 и x86_64.

...