Мой код пытается найти энтропию сигнала (хранится в «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, и это не удалось.Все еще не знаю почему!