C 如何将OpenMP指令(#pragmas)包装为函数或类似函数的宏?

C 如何将OpenMP指令(#pragmas)包装为函数或类似函数的宏?,c,macros,openmp,c-preprocessor,C,Macros,Openmp,C Preprocessor,我正在尝试将OpenMP与另一种发出C代码的语言(C代码生成器)连接起来。从我的角度来看(我不是另一种语言的设计者),通过调用C函数或类似函数的宏而不是直接使用#pragma或#pragma来实现这一点是最简单的。我在C预处理器方面没有太多经验,但我在维基百科上找到了一个简单的例子,但效果并不令人满意。以下是原始的C示例: #include <omp.h> #include <stdio.h> #include <stdlib.h> int main (in

我正在尝试将OpenMP与另一种发出C代码的语言(C代码生成器)连接起来。从我的角度来看(我不是另一种语言的设计者),通过调用C函数或类似函数的宏而不是直接使用#pragma或#pragma来实现这一点是最简单的。我在C预处理器方面没有太多经验,但我在维基百科上找到了一个简单的例子,但效果并不令人满意。以下是原始的C示例:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {
  int th_id, nthreads;
  #pragma omp parallel private(th_id)
  {
    th_id = omp_get_thread_num();
    printf("Hello World from thread %d\n", th_id);
    #pragma omp barrier
    if ( th_id == 0 ) {
      nthreads = omp_get_num_threads();
      printf("There are %d threads\n",nthreads);
    }
  }
  return EXIT_SUCCESS;
}
预处理器将发出一个错误,但如果我真的编译了预处理的代码,它将按预期工作。有没有更合法的方法来实现这一点(更不用说在大多数构建管道中不会导致构建错误的方法)


在将其转换为字符串文字之前,我将连接
pragma
。大概是这样的:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

#define STR(x) #x
#define STRINGIFY(x) STR(x) 
#define CONCATENATE(X,Y) X ( Y )

#define pragma_omp_parallel_private(x) \
  _Pragma( STRINGIFY( CONCATENATE(omp parallel private,x) ) )

int main (int argc, char *argv[]) {
  int th_id, nthreads;

  // #pragma omp parallel private(th_id)
  pragma_omp_parallel_private(th_id)
  {
    th_id = omp_get_thread_num();
    printf("Hello World from thread %d\n", th_id);
    #pragma omp barrier
    if ( th_id == 0 ) {
      nthreads = omp_get_num_threads();
      printf("There are %d threads\n",nthreads);
    }
  }
  return EXIT_SUCCESS;
}
#包括
#包括
#包括
#定义STR(x)#x
#定义STRINGIFY(x)STR(x)
#定义连接(X,Y)X(Y)
#定义pragma\u omp\u parallel\u private(x)\
_Pragma(STRINGIFY(CONCATENATE(omp parallel private,x)))
int main(int argc,char*argv[]){
int th_id,n个字符;
//#pragma omp并行专用(th#U id)
pragma_omp_parallel_private(th_id)
{
th_id=omp_get_thread_num();
printf(“来自线程%d\n的Hello World”,THU id);
#布拉格奥姆普屏障
如果(th_id==0){
nthreads=omp_get_num_threads();
printf(“有%d个线程\n”,n个线程);
}
}
返回退出成功;
}

我试图回答您下面的直接问题。不管怎么说,我很好奇为什么你一开始就需要这样一台机器。谢谢,这真的奏效了!原因似乎是该语言不允许在特定位置内联C代码;根据使用的机构,它将被放置在顶部、底部或未指定的位置。但是,它确实支持调用C函数或宏(内联:;C函数调用:)。。。您希望使用打开/关闭宏在生成的C代码中定义并行区域。好吧,祝你黑客愉快!:-)回答得好。有关
\u Pragma
的说明,请参阅。
$ gcc -E -fopenmp wikiHello.c > wikiHello_pp.c
wikiHello.c:11:34: error: pasting "private" and "(" does not give a valid preprocessing token
   _Pragma(STRINGIFY(omp parallel private ## (thread_id)))
                                  ^
wikiHello.c:17:3: note: in expansion of macro ‘pragma_omp_parallel_private’
   pragma_omp_parallel_private(th_id)
   ^
$ gcc -fopenmp wikiHello_pp.c

$ ./a.exe
Hello World from thread 3
Hello World from thread 6
Hello World from thread 4
Hello World from thread 7
Hello World from thread 1
Hello World from thread 5
Hello World from thread 2
Hello World from thread 0
There are 8 threads
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>

#define STR(x) #x
#define STRINGIFY(x) STR(x) 
#define CONCATENATE(X,Y) X ( Y )

#define pragma_omp_parallel_private(x) \
  _Pragma( STRINGIFY( CONCATENATE(omp parallel private,x) ) )

int main (int argc, char *argv[]) {
  int th_id, nthreads;

  // #pragma omp parallel private(th_id)
  pragma_omp_parallel_private(th_id)
  {
    th_id = omp_get_thread_num();
    printf("Hello World from thread %d\n", th_id);
    #pragma omp barrier
    if ( th_id == 0 ) {
      nthreads = omp_get_num_threads();
      printf("There are %d threads\n",nthreads);
    }
  }
  return EXIT_SUCCESS;
}