gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:38:33 26 4
gpt4 key购买 nike

我正在尝试将 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_omp_parallel_private) 来做我想做的事:

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

#define STR(x) #x
#define STRINGIFY(x) STR(x)
#define omp_par_pri STRINGIFY(omp parallel private)

char omp_test[] = omp_par_pri;
#define pragma_omp_parallel_private(thread_id) \
_Pragma(STRINGIFY(omp parallel private ## (thread_id)))

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;
}

预处理器会发出错误,但如果我实际编译预处理代码,它会按预期工作。是否有更合法的方法来实现此目的(更不用说在大多数构建管道中不会导致构建错误的方法)?

$ 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

最佳答案

在将其转换为字符串文字之前,我会连接 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;
}

关于c - 如何将 OpenMP 指令 (#pragmas) 包装为函数或类似函数的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23524195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com