英特尔 C++ 编译器:如何在宏 definition/define 中编译和 link openmp pragma?
Intel c++ compiler: how to compiler and link openmp pragma in macro definition/define?
我有一个简单的代码,它在宏定义中使用 pragma。使用 QtMinGW 可以很好地编译和运行代码。
#include <omp.h>
#include <stdio.h>
#define NUMEL 1024
#define OMP_PARALLEL _Pragma("omp parallel")
#define OMP_FOR _Pragma("omp for")
#define main_func(par) \
int main(){ \
int a[NUMEL]; \
OMP_PARALLEL \
{ \
int i; \
OMP_FOR \
for (i=0; i<NUMEL; i++){ \
printf("THRD : %d \n", omp_get_thread_num()); \
a[i] = tan(i*2); \
} \
} \
return 0; \
}
main_func(par)
但是,如果我使用英特尔 C++ 编译器 (ICC)(icl.exe on windows),它会输出以下错误:
error: expected a ";"
main_func(par)
通过尝试和错误,我注意到如果添加;在下面的行中,错误更改为链接错误:
#define OMP_PARALLEL _Pragma("omp parallel");
#define OMP_FOR _Pragma("omp for");
Link 错误
test_omp.obj : error LNK2019: unresolved external symbol _Pragma referenced in function main
test_omp.exe : fatal error LNK1120: 1 unresolved externals
make: *** [Makefile:16: test_omp] Error 1120
任何评论都非常感谢。
在 icc 论坛上尝试和错误一些 Q/A 之后结果是
- _Pragma 应替换为 __pragma
- 不需要引号
因此在宏定义中使用 omp pragmas 的 intel/icc 语法应该更正如下:
#define OMP_PARALLEL __pragma(omp parallel)
#define OMP_FOR __pragma(omp for)
希望对其他人有所帮助...我留下了测试代码和makefile,你也试试吧。我花了 3 天时间才解决这个问题。
如果觉得有帮助,请随时为我的 Q/A 投票。
#include <omp.h>
#include <stdio.h>
#define NUMEL 1024
#define OMP_PARALLEL __pragma(omp parallel)
#define OMP_FOR __pragma(omp for)
#define main_func(par) \
int main(){ \
int a[NUMEL]; \
OMP_PARALLEL \
{ \
int i; \
OMP_FOR \
for (i=0; i<NUMEL; i++){ \
printf("THRD : %d \n", omp_get_thread_num()); \
a[i] = tan(i*2); \
} \
} \
return 0; \
}
main_func(par)
int main2(){
int a[NUMEL];
#pragma omp parallel
{
int i;
#pragma omp for
for (i=0; i<NUMEL; i++){
printf("THRD : %d \n", omp_get_thread_num());
a[i] = tan(i*2);
}
}
return 0;
}
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
CXX=icl
CC=icl
LD =xilink
LIBDIR=Debug/lib/
OBJDIR=Debug/obj/
CFLAGS=/Qopenmp
LDFLAGS= /nodefaultlib:vcomp libiomp5md.lib
OBJS = $(OBJDIR)test_omp.obj
all: test_omp
test_omp: $(OBJS)
$(LD) $(LDFLAGS) $(OBJS) -Fe:test_omp.exe
$(OBJDIR)%.obj: $(PROJECT_ROOT)%.cpp
$(CXX) -c $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -Fo:$@ $<
$(OBJDIR)%.obj: $(PROJECT_ROOT)%.c
$(CC) $(CFLAGS) $(CPPFLAGS) -Fo:$@ -c $<
clean:
rm -fr test_icl $(OBJS) test_omp.exe
我有一个简单的代码,它在宏定义中使用 pragma。使用 QtMinGW 可以很好地编译和运行代码。
#include <omp.h>
#include <stdio.h>
#define NUMEL 1024
#define OMP_PARALLEL _Pragma("omp parallel")
#define OMP_FOR _Pragma("omp for")
#define main_func(par) \
int main(){ \
int a[NUMEL]; \
OMP_PARALLEL \
{ \
int i; \
OMP_FOR \
for (i=0; i<NUMEL; i++){ \
printf("THRD : %d \n", omp_get_thread_num()); \
a[i] = tan(i*2); \
} \
} \
return 0; \
}
main_func(par)
但是,如果我使用英特尔 C++ 编译器 (ICC)(icl.exe on windows),它会输出以下错误:
error: expected a ";"
main_func(par)
通过尝试和错误,我注意到如果添加;在下面的行中,错误更改为链接错误:
#define OMP_PARALLEL _Pragma("omp parallel");
#define OMP_FOR _Pragma("omp for");
Link 错误
test_omp.obj : error LNK2019: unresolved external symbol _Pragma referenced in function main
test_omp.exe : fatal error LNK1120: 1 unresolved externals
make: *** [Makefile:16: test_omp] Error 1120
任何评论都非常感谢。
在 icc 论坛上尝试和错误一些 Q/A 之后结果是
- _Pragma 应替换为 __pragma
- 不需要引号
因此在宏定义中使用 omp pragmas 的 intel/icc 语法应该更正如下:
#define OMP_PARALLEL __pragma(omp parallel)
#define OMP_FOR __pragma(omp for)
希望对其他人有所帮助...我留下了测试代码和makefile,你也试试吧。我花了 3 天时间才解决这个问题。
如果觉得有帮助,请随时为我的 Q/A 投票。
#include <omp.h>
#include <stdio.h>
#define NUMEL 1024
#define OMP_PARALLEL __pragma(omp parallel)
#define OMP_FOR __pragma(omp for)
#define main_func(par) \
int main(){ \
int a[NUMEL]; \
OMP_PARALLEL \
{ \
int i; \
OMP_FOR \
for (i=0; i<NUMEL; i++){ \
printf("THRD : %d \n", omp_get_thread_num()); \
a[i] = tan(i*2); \
} \
} \
return 0; \
}
main_func(par)
int main2(){
int a[NUMEL];
#pragma omp parallel
{
int i;
#pragma omp for
for (i=0; i<NUMEL; i++){
printf("THRD : %d \n", omp_get_thread_num());
a[i] = tan(i*2);
}
}
return 0;
}
PROJECT_ROOT = $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
CXX=icl
CC=icl
LD =xilink
LIBDIR=Debug/lib/
OBJDIR=Debug/obj/
CFLAGS=/Qopenmp
LDFLAGS= /nodefaultlib:vcomp libiomp5md.lib
OBJS = $(OBJDIR)test_omp.obj
all: test_omp
test_omp: $(OBJS)
$(LD) $(LDFLAGS) $(OBJS) -Fe:test_omp.exe
$(OBJDIR)%.obj: $(PROJECT_ROOT)%.cpp
$(CXX) -c $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -Fo:$@ $<
$(OBJDIR)%.obj: $(PROJECT_ROOT)%.c
$(CC) $(CFLAGS) $(CPPFLAGS) -Fo:$@ -c $<
clean:
rm -fr test_icl $(OBJS) test_omp.exe