Tag: openmp

为什么OpenMP无法对这些数字求和?

考虑以下最小C代码示例。 在使用export OMP_NUM_THREADS=4 && gcc -fopenmp minimal2.c && ./a.out X 10.11上的自制GCC 5.2.0)进行编译和执行时,这通常会产生正确的行为,即七行具有相同的编号。 但有时会发生这种情况: [ ] bsum=1.893293142303100e+03 [1] asum=1.893293142303100e+03 [2] asum=1.893293142303100e+03 [0] asum=1.893293142303100e+03 [3] asum=3.786586284606200e+03 [ ] bsum=1.893293142303100e+03 [ ] asum=3.786586284606200e+03 equal: 0 它看起来像一个竞争条件,但我的代码对我来说似乎很好。 我究竟做错了什么? #include #include #include #ifdef _OPENMP #include #define ID omp_get_thread_num() #else #define ID 0 #endif #define N 1400 double a[N]; double verify() […]

使用OpenMP进行编译会导致内存泄漏

根据valgrind的说法,在使用OpenMP编译一个简单的hello-world程序时,我可能会导致内存泄漏。 这没有意义,因为hello-world程序不会故意使用任何OpenMPfunction。 假设下面的程序名为hi.c并根据编译 $ gcc -o hi hi.c GCC版本4.8.3 #include int main( void ) { printf( “hi\n” ); return 1; } 我们应该期待来自valgrind的泄漏报告来validation显而易见的:没有泄漏。 我的观察结果与此假设一致: $ valgrind –tool=memcheck ./hi ==13064== Memcheck, a memory error detector ==13064== Copyright (C) 2002-2013, and GNU GPL’d, by Julian Seward et al. ==13064== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright […]

OpenMP Segfault

我试图将OpenMP并行化添加到一个工作代码(只是一个for循环),但我无法摆脱分段错误。 问题来自这条线: pos += sprintf(com + pos, “%d “, i); com是一个字符数组,我尝试将它定义为char com[255]或char *com = malloc(255*sizeof(char)) ,在for循环内部和之前。 当我在循环之前定义com时,我将private(com)添加到#pragma omp parallel for directive。 我也尝试初始化它并使用firstprivate 。 ( pos是一个整数,初始化为0 ) 当我不添加-fopenmp一切正常,但是使用-fopenmp它会产生段错误。 我错过了什么?

OpenMP Producer-Consumer意外结果

我正在研究一个简单的生产者 – 消费者问题,在C中使用OpenMP。 我的程序创建了4个线程,其中两个是消费者,两个是生产者。 每个制作人将一个角色放在一个缓冲区中,消费者只需打印该角色。 我的目标是同步生产者/消费者,以便每个生产者将生成字母表中的下一个按顺序字符,并且每个消费者将打印放置在缓冲区中的下一个按顺序字符。 这是我的代码: #include #include #include #define SIZE 5 #define NUMITER 26 char buffer[SIZE]; int nextin = 0; int nextout = 0; int count = 0; int empty = 1; int full = 0; int i,j; void put(char item) { buffer[nextin] = item; nextin = (nextin + 1) % SIZE; count++; […]

使用clang编译时,openmp无法正确链接

我已经在Ubuntu 16.04上从源代码构建了clang 4.0,并且我正在尝试编译一个简单的OpenMP程序但是收到以下错误。 /tmp/test-7f2c7c.o: In function `main’: /home/me/sf_shared/test.c:(.text+0x52): undefined reference to `__kmpc_fork_call’ /tmp/test-7f2c7c.o: In function `.omp_outlined.’: /home/me/sf_shared/test.c:(.text+0xd9): undefined reference to `__kmpc_for_static_init_4′ /home/me/sf_shared/test.c:(.text+0x16d): undefined reference to `__kmpc_for_static_fini’ clang-4.0: error: linker command failed with exit code 1 (use -v to see invocation) 编译我正在使用./bin/clang ~/sf_shared/tset.c -fopenmp其中bin是bin文件夹,我从源代码构建clang,test.c是一个简单的openmp程序。 添加-v导致以下结果 clang version 4.0.1 Target: x86_64-unknown-linux-gnu Thread model: posix InstalledDir: /home/me/release_build/./bin Found […]

OpenMP并行快速排序

我尝试使用OpenMP在分区部分和快速排序部分中并行快速排序。 我的C代码如下: #include “stdlib.h” #include “stdio.h” #include “omp.h” // parallel partition int ParPartition(int *a, int p, int r) { int b[rp]; int key = *(a+r); // use the last element in the array as the pivot int lt[rp]; // mark 1 at the position where its element is smaller than the key, else 0 int […]

使用C与OpenMP求和

我一直试图将这段代码并行化大约两天并且一直存在逻辑错误。 程序是使用非常小的dx的总和找到积分的面积并计算积分的每个离散值。 我试图用openmp实现这个,但我实际上没有使用openmp的经验。 我想请你的帮助。 实际目标是在线程中并行化suma变量,以便每个线程计算更少的积分值。 程序编译成功,但是当我执行程序时,它会返回错误的结果。 #include #include #include #include int main(int argc, char *argv[]){ float down = 1, up = 100, dx, suma = 0, j; int steps, i, nthreads, tid; long starttime, finishtime, runtime; starttime = omp_get_wtime(); steps = atoi(argv[1]); dx = (up – down) / steps; nthreads = omp_get_num_threads(); tid = omp_get_thread_num(); […]

#pragma omp flush在线程之间建立交换数据

你写了一个非常简单的例子,说明如何使用omp flush来交换数据,以生产者 – >消费者的方式,在线程中我发现了一个有趣的行为。 int a=-1; int flag=1; int count=0; #pragma omp parallel num_threads(2) { int TID; TID=omp_get_thread_num(); #pragma omp sections { #pragma omp section /////////// Producer { for(int i=0; i<9;i++) { a=i; #pragma omp flush(a) flag=1; printf("Producer a: %d flag:%d TID %d \n",a,flag,TID); while(flag) { #pragma omp flush(flag) } } flag=2; #pragma omp flush(flag) […]

OpenMP自定义缩减变量

我被指派实施减少变量的想法,而不使用减少条款。 我设置了这个基本代码来测试它。 int i = 0; int n = 100000000; double sum = 0.0; double val = 0.0; for (int i = 0; i < n; ++i) { val += 1; } sum += val; 所以最后sum == n 。 每个线程都应该将val设置为私有变量,然后对sum的加法应该是线程收敛的关键部分,例如 int i = 0; int n = 100000000; double sum = 0.0; double val = […]

C OMP omp_get_wtime()返回时间0.00

我使用了omp_get_wtime(),但是当我想打印时间总是得到0.00时,问题出在哪里? #define SIZE 500 #define nthreads 10 (…) void sumTab(int mX[][SIZE], int mY[][SIZE], int mZ[][SIZE]) { int i,k; double start = omp_get_wtime(); #pragma omp parallel for schedule(dynamic,3) private(i) num_threads(nthreads) for(i=0 ; i<SIZE ; i++) { for(k=0 ; k<SIZE ; k++) { mZ[i][k]=mX[i][k]+mY[i][k]; printf("Thread no %d \t [%d] [%d] result: %d\n", omp_get_thread_num(),i,k, mZ[i][k]); } } printf("Time: […]