Ошибка: ‘ALIGN’ необъявлен (первое использование в этой функции) с 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не так ли?

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

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

РЕДАКТИРОВАТЬ

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

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

должно быть

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]