2016-12-02 4 views
0

У меня есть странная ошибка при компиляции следующего источника:Ошибка: необъявленная (первое использование в этой функции) «Выровнять» с ALIGN определяется в макро

#include <stdio.h> 
#include <stdlib.h> 
#include <mach/mach_time.h> 
#include <mm_malloc.h> 

#ifdef SSE 
#include <x86intrin.h> 
#define ALIGN 16 
void addition_tab(int size, double *a, double *b, double *c) 
{ 

int i; 
// Main loop 
for (i=size-1; i>=0; i-=2) 
{ 
    // Intrinsic SSE syntax 
    const __m128d x = _mm_loadu_pd(a); // Load two x elements 
    const __m128d y = _mm_loadu_pd(b); // Load two y elements 
    const __m128d sum = _mm_add_pd(x, y); // Compute two sum elements 
    _mm_storeu_pd(c, sum); // Store two sum elements 

    // Increment pointers by 2 since SSE vectorizes on 128 bits = 16 bytes = 2*sizeof(double) 
    a += 2; 
    b += 2; 
    c += 2; 
} 

} 
#endif 

int main(int argc, char *argv[]) 
{ 
    // Array index 
    int i; 

    // Array size as argument 
    int size = atoi(argv[1]); 

    // Time elapsed 
    uint64_t t1, t2; 
    float duration; 

    // Two input arrays 
    double *tab_x; 
    double *tab_y; 
    double *tab_z; 

    // Get the timebase info 
    mach_timebase_info_data_t info; 
    mach_timebase_info(&info); 

#ifdef NOVEC 
    // Allocation 
    tab_x = (double*) malloc(size*sizeof(double)); 
    tab_y = (double*) malloc(size*sizeof(double)); 
    tab_z = (double*) malloc(size*sizeof(double)); 
#else 
    // Allocation 
    tab_x = (double*) _mm_malloc(size*sizeof(double),ALIGN); 
    tab_y = (double*) _mm_malloc(size*sizeof(double),ALIGN); 
    tab_z = (double*) _mm_malloc(size*sizeof(double),ALIGN); 
#endif 
} 

Если я компилирую с:

gcc-mp-4.9 -DNOVEC -O0 main.c -o exe 

компиляция выполняется, но с:

gcc-mp-4.9 -DSSE -O3 -msse main.c -o exe 

Я получаю следующее сообщение об ошибке:

main.c: In function 'main': 
main.c:96:52: error: 'ALIGN' undeclared (first use in this function) 
    tab_x = (double*) _mm_malloc(size*sizeof(double),ALIGN); 

Однако переменная ALIGN определяется, если я прохожу SSE макрос с gcc-mp-4.9 -DSSE, не так ли?

Спасибо за вашу помощь

+1

Да: '' -DSSE' определить SSE' для precomplier. Вы уверены в ошибке? Это ваш настоящий код? Выложенный код кажется прекрасным. – LPs

+0

Сначала я вижу, что 'ALIGN' используется также в случае' # Компилировать с AVX256', но с этим макросом 'ALIGN' не определяется. – LPs

+0

однако, у меня есть в main.c: #ifdef AVX256 #include #define ALIGN 32 – youpilat13

ответ

0

я узнал причину в сценарий: вы не изолируя Novec поэтому компиляция с NOVEC макроса всегда. Вы могли бы выделить его с помощью:

if [ "$1" == "novec" ]; then 
# Compile no vectorized and vectorized executables 
$GCC -DNOVEC -O0 main_benchmark.c -o noVectorizedExe 
$GCC -DNOVEC -O0 main_benchmark.c -S -o noVectorizedExe.s 
elif [ "$1" == "sse" ]; then 
# Compile with SSE 
$GCC -DSSE -O3 -msse main_benchmark.c -o vectorizedExe 
$GCC -DSSE -O3 -msse main_benchmark.c -S -o vectorizedExe.s 
echo "Test" 
elif [ "$1" == "avx" ]; then 
# Compile with AVX256 
$GCC -DAVX256 -O3 -mavx main_benchmark.c -o vectorizedExe 
$GCC -DAVX256 -O3 -mavx main_benchmark.c -S -o vectorizedExe.s 
fi 

EDIT

я узнал, что это, у вас есть опечатка !!

$GCC -DNOVEV -O0 main_benchmark.c -S -o noVectorizedExe.s 

должен быть

$GCC -DNOVEC -O0 main_benchmark.c -S -o noVectorizedExe.s 
+0

систематическая «NOVEC» компиляция хотела, я всегда хочу, не-векторизации версии (noVectorizedExe исполняемого файла), когда я выполнить этот сценарий. Не могли бы вы объяснить, почему это будет проблемой? – youpilat13

+0

@ youpilat13 Найден !! Взгляните на мое редактирование. ;) – LPs

+0

большое спасибо! С уважением – youpilat13