【问题标题】:Error: 'ALIGN' undeclared (first use in this function) with ALIGN defined into macro错误:未声明“对齐”(在此函数中首次使用),对齐定义为宏
【发布时间】:2016-12-02 17:47:41
【问题描述】:

我在编译以下源代码时遇到了一个奇怪的错误:

#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);

但是,如果我将SSE 宏与gcc-mp-4.9 -DSSE 一起传递,变量ALIGN 就会被定义,不是吗?

感谢您的帮助

【问题讨论】:

  • 是:-DSSE 为预编译器定义 SSE。你确定错误吗?那是你的真实代码吗?发布的代码看起来不错。
  • 乍一看,我可以看到ALIGN 也用于# Compile with AVX256 的情况,但是没有定义该宏ALIGN
  • 但是,我进入 main.c :#ifdef AVX256 #include #define ALIGN 32

标签: c++ c gcc macros pre-compilation


【解决方案1】:

我在您的脚本中找到了根本原因:您没有隔离 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

【讨论】:

  • 需要系统的“NOVEC”编译,我在执行这个脚本时总是想要一个非矢量化版本(noVectorizedExe 可执行文件)。你能解释一下为什么这会是个问题吗?
猜你喜欢
  • 1970-01-01
  • 2016-05-09
  • 2018-10-03
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多