- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试将 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/
我应该使用其中哪些忽略警告? #pragma clang diagnostic ignored "-W" #pragma GCC diagnostic ignored "-W" 两者似乎都对我有用,但
#pragma startup and #pragma exit: These directives helps us to specify the functions that are needed
Xcode 中 #pragma 标记的目的是什么?它们在 .m 文件中的位置是否重要?某些 #pragma 是否应该排在所有其他之前? 他们必须在场吗? 可以添加新标记吗?他们为什么会这样?是什么原因
我想使用 nim 访问完整模块(文件)的 AST。我发现,任何宏都可以用作自定义编译指示,所以我在文件 foo.nim 中做了这样的事情: import macros macro getAst(ast
考虑: void saxpy_worksharing(float* x, float* y, float a, int N) { #pragma omp parallel for
在带有 openMP 的 C++ 中,两者之间有什么区别吗 #pragma omp parallel for for(int i=0; i
在 Visual Studio 2010 中使用 C++ native 解决方案。 #pragma warning (push) 用于 cpp 文件的开头,在所有包含之后。之后,#pragma war
在 #pragma omp parallel 的开头创建了一堆线程,然后当我们到达 #pragma omp for 时,工作负载被分配。如果这个 for 循环内部有一个 for 循环,并且我在它之前也
使用#pragma pop_macro("int") #include using namespace std; #define int double void main() { int i
我正在处理一些事情,试图让孤立工作发挥作用,并通过减少 #pragma omp parallel 的调用来减少开销。我正在尝试的是这样的: #pragma omp parallel default(n
我是 OpenMP 的新手,我一直在尝试运行一个使用 OpenMP 添加两个数组的程序。在 OpenMP 教程中,我了解到,在 for 循环上使用 OpenMP 时,我们需要使用 #pragma om
我阅读了有关循环展开的文档。它解释说,如果将展开因子设置为 1,则程序将像使用 #pragma nounrolling 一样工作。 但是,该文件不包括#pragma unroll(0) 案例..由于
我正在尝试使用 #pragma pack (n) 对齐数据成员.以下面为例: #include using namespace std; #pragma pack(8) // or (16) str
我是 C 语言的菜鸟,正在尝试学习 #pragma 预处理器指令。我在谷歌上查找并找到了这个链接:GeeksforGeeks Pragma Directive in C 在这个链接中,他们说 #pra
之间有什么区别: #pragma omp for {for_loop} 和 #pragma omp parallel for {for_loop} 最佳答案 #pragma omp par
我正在查看一些 C++/CLI 代码,并且看到了很多这样的语句,主要是围绕 #includes。他们的意思是什么?我知道他们,根据 MSDN,Enable function-level control
在 OpenMP 中 #pragma omp master 中的任何代码指令由单个线程(主线程)执行,在区域末尾没有隐含的屏障。 (见 section on MASTER directive in t
一些项目使用 #pragma nv_exec_check_disable 和/或 #pragma hd_warning_disable 使 NVCC 的警告静音 warning: calling a
英特尔编译器允许我们通过以下方式对循环进行矢量化 #pragma simd for ( ... ) 但是,您也可以选择使用 OpenMP 4 的指令执行此操作: #pragma omp simd fo
我想构建一些代码,在加载共享库时调用一些代码。我以为我会这样做: #pragma init(my_init) static void my_init () { //do-something }
我是一名优秀的程序员,十分优秀!