Tag: openmp

如何在C代码中获取变量的类型?

有没有什么方法可以在C中自动发现变量的类型,或者通过程序本身的某种机制,或者 – 更可能 – 通过使用编译器的预编译脚本传递到它的位置解析了变量并为它们分配了类型? 我正在寻找关于此的一般性建议。 下面是关于我需要什么和为什么的更多背景。 我想改变OpenMP减少子句的语义。 在这一点上,简单地通过调用函数替换源代码中的子句(通过脚本)似乎是最容易的,然后我可以定义函数来实现我想要的缩减语义。 例如,我的脚本会转换它 #pragma omp parallel for reduction(+:x) 进入这个: my_reduction(PLUS, &x, sizeof(x)); #pragma omp parallel for 在哪里,我早些时候(比方说) enum reduction_op {PLUS, MINUS, TIMES, AND, OR, BIT_AND, BIT_OR, BIT_XOR, /* … */}; 并且my_reduction有签名 void my_reduction(enum reduction_op op, void * var, size_t size); 除此之外, my_reduction必须像程序员最初预期的那样将加法运算应用于简化变量。 但我的function无法知道如何正确地做到这一点。 特别是,虽然它知道操作的类型( PLUS ),原始变量的位置( var )以及变量类型的大小,但它不知道变量的类型本身。 […]

使用开放式mp的慢稀疏矩阵向量积(CSR)

我正在尝试使用open mp加速稀疏矩阵向量产品,代码如下: void zAx(double * z, double * data, long * colind, long * row_ptr, double * x, int M){ long i, j, ckey; int chunk = 1000; //int * counts[8]={0}; #pragma omp parallel num_threads(8) { #pragma omp for private(ckey,j,i) schedule(static,chunk) for (i=0; i<M; i++ ){ z[i]=0; for (ckey=row_ptr[i]; ckey<row_ptr[i+1]; ckey++) { j = colind[ckey]; […]

我如何处理OpenMP中的数据竞争?

我试图使用OpenMP在数组中添加数字。 以下是我的代码: int* input = (int*) malloc (sizeof(int)*snum); int sum = 0; int i; for(i=0;i<snum;i++){ input[i] = i+1; } #pragma omp parallel for schedule(static) for(i=0;i<snum;i++) { int* tmpsum = input+i; sum += *tmpsum; } 这并不能产生正确的结果。 怎么了?

如何确保动态分配的数组在openmp中是私有的

我在Linux机器上使用gcc使用openMP在C中工作。 在openmp并行for循环中,我可以将静态分配的数组声明为private。 考虑代码片段: int a[10]; #pragma omp parallel for shared(none) firstprivate(a) for(i=0;i<4;i++){ 一切都按预期工作。 但如果相反我动态分配, int * a = (int *) malloc(10*sizeof(int)); #pragma omp parallel for shared(none) firstprivate(a) a(至少a [1 … 9])的值不受保护,但就好像它们是共享的一样。 这是可以理解的,因为pragma命令中的任何内容似乎都没有告诉omp数组a需要私有多大。 如何将此信息传递给openmp? 如何将整个动态分配的数组声明为私有?

C ++:Linux中的时序(使用clock())不同步(由于OpenMP?)

在程序的顶部和末尾,我使用clock()来计算程序完成所需的时间。 不幸的是,它的报告时间似乎只有一半。 我用“time”命令仔细检查了这一点。 我的计划报告:在45.86s完成 时间命令报告:实际0m22.837s用户0m45.735s sys 0m0.152s 使用我的手机计时,它在23秒完成(又名:“真正的”时间)。 “用户”时间是所有线程的总和,这在我使用OpenMP之后才有意义。 (您可以在这里阅读: ‘真实’,’用户’和’sys’在时间(1)的输出中是什么意思? ) 那么,为什么clock()报告的是“用户”时间而不是“真实”时间? 我应该使用不同的函数来计算程序运行的时间吗? 作为旁注,Windows的clock()按预期工作,并在“实际”时间内报告。

OpenMP,用于循环内部部分

我想运行以下代码(如下)。 我想生成两个独立的线程,每个线程都会运行并行for循环。 不幸的是,我收到了一个错误。 显然,并行不能在section内部产生。 怎么解决? #include #include “stdio.h” int main() { omp_set_num_threads(10); #pragma omp parallel #pragma omp sections { #pragma omp section #pragma omp for for(int i=0; i<5; i++) { printf("x %d\n", i); } #pragma omp section #pragma omp for for(int i=0; i<5; i++) { printf(". %d\n", i); } } // end parallel and end […]

在OS X Yosemite上使用gcc编译器编译OpenMP程序

$ gcc 12.c -fopenmp 12.c:9:9: fatal error: ‘omp.h’ file not found #include ^ 1 error generated. 在编译openMP程序时,我得到了上述错误。 我正在使用OS X Yosemite。 我首先尝试通过在终端中输入gcc来安装本机gcc编译器,后来又下载了Xcode我仍然遇到了同样的错误。 然后我下载了gcc: $ brew install gcc 我仍然得到同样的错误。 我确实尝试更改编译器路径,它仍显示: $ which gcc /usr/bin/gcc 那么如何用gcc编译程序呢?

如何并行生成随机数?

我想使用openMP并行生成伪随机数,如下所示: int i; #pragma omp parallel for for (i=0;i<100;i++) { printf("%d %d %d\n",i,omp_get_thread_num(),rand()); } return 0; 我已经在Windows上测试了它并且我获得了巨大的加速,但是每个线程生成了完全相同的数字。 我已经在Linux上测试了它并且我得到了巨大的减速,8核处理器上的并行版本比顺序慢了大约10倍,但每个线程生成了不同的数字。 有没有办法同时加速和不同的数字? 编辑27.11.2010 我想我已经用Jonathan Dursi的post解决了这个问题。 似乎下面的代码在linux和windows上运行得很快。 数字也是伪随机的。 你怎么看待这件事? int seed[10]; int main(int argc, char **argv) { int i,s; for (i=0;i<10;i++) seed[i] = rand(); #pragma omp parallel private(s) { s = seed[omp_get_thread_num()]; #pragma omp for for (i=0;i<1000;i++) { printf("%d […]

OpenMP和CPU亲和力

sched_setaffinity或pthread_attr_setaffinity_np可以在OpenMP下设置线程关联? 相关: CPU亲和力

在Mac OS X 10.11上安装OpenMP

如何让OpenMP在Mac OSX 10.11上运行,以便我可以通过终端执行脚本? 我已经安装了OpenMP: brew install clang-omp 。 当我运行时,例如: gcc -fopenmp -o Parallel.b Parallel.c以下表达式返回: fatal error: ‘omp.h’ file not found 我也尝试过: brew install gcc –without-multilib但不幸的是,这最终返回了以下内容(在首次安装一些依赖项之后): The requested URL returned error: 404 Not Found Error: Failed to download resource “mpfr–patch” 任何推荐的工作?