标签: openmp

如何确保动态分配的数组在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++){
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.但如果相反我动态分配,

int * a = (int *) malloc(10*sizeof(int));
#pragma omp parallel for shared(none) firstprivate(a)
Run Code Online (Sandbox Code Playgroud)

a(至少a [1 ... 9])的值不受保护,但就好像它们是共享的一样.这是可以理解的,因为pragma命令中的任何内容似乎都没有告诉omp需要私有的数组a有多大.我怎样才能将这些信息传递给openmp?如何将整个动态分配的数组声明为私有?

c malloc parallel-processing openmp

12
推荐指数
2
解决办法
3万
查看次数

我需要在C/C++源代码中使用#include <omp.h>吗?

是否有必要在我的C/C++源代码中包含omp.h?为什么?或者为什么不呢?当与-fopenmp标志一起使用时,gcc编译器是否默认包含它?它似乎并不是一个不同之处.

c gcc openmp

12
推荐指数
2
解决办法
2万
查看次数

我可以查看我安装的OpenMP版本吗?

我试图找出我的机器上安装了哪个版本的OpenMP.这是我连接使用的Linux盒子ssh.

我正在使用gcc编译-fopenmp.

linux gcc version openmp

12
推荐指数
2
解决办法
3万
查看次数

c中的并行快速排序

经过大量搜索c中并行快速排序的实现后,我即将潜入并自己编写代码.(我需要对一个大约100万个文本字符串的数组进行排序.)似乎我发现的所有实现都将qsort函数本身的工作分开,这在分割每个线程相对少量的工作时会产生大量的开销.

将100万个字符串除以线程数(在我的情况下是24个线程)并将它们分别放在一个节上,然后进行合并输出会不会快得多?当然,这具有理论上的缺点,即它不是就地排序,但是随着可用内存的大量存在,这不是问题.运行的机器有12个(非常快)物理/ 24逻辑核心和192 GB(是,千兆字节)的内存.目前,即使在这台机器上,排序也需要大约8分钟!

c parallel-processing quicksort openmp

12
推荐指数
1
解决办法
2万
查看次数

'#pragma omp master'与'#pragma omp single'相比有什么好处?

在OpenMP中,#pragma omp master指令内的任何代码都由单个线程(主控)执行,而在区域末尾没有隐含的屏障.(请参阅LLNL OpenMP教程中有关MASTER指令的部分).

这似乎相当于#pragma omp single nowait(除了'master'之外,任何线程都可以执行单个区域).

在什么情况下,如果有的话,使用#pragma omp master是否有益?

openmp

12
推荐指数
2
解决办法
1万
查看次数

使用openmp parallel for loop意外地表现出色

我之前的评论(特别是@Zboson)之后我编辑了我的问题,以提高可读性

我一直采取行动并观察传统观点,即openmp线程的数量应与机器上的超线程数大致匹配,以获得最佳性能.但是,我观察到我的新笔记本电脑采用Intel Core i7 4960HQ,4核 - 8线程的奇怪行为.(请参阅此处的英特尔文档)

这是我的测试代码:

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

int main() {
    const int n = 256*8192*100;
    double *A, *B;
    posix_memalign((void**)&A, 64, n*sizeof(double));
    posix_memalign((void**)&B, 64, n*sizeof(double));
    for (int i = 0; i < n; ++i) {
        A[i] = 0.1;
        B[i] = 0.0;
    }
    double start = omp_get_wtime();
    #pragma omp parallel for
    for (int i = 0; i < n; ++i) {
        B[i] = exp(A[i]) + sin(B[i]);
    }
    double end = omp_get_wtime(); …
Run Code Online (Sandbox Code Playgroud)

parallel-processing multithreading gcc openmp avx

12
推荐指数
1
解决办法
2241
查看次数

C OpenMP - 降低可扩展性

我正在测试使用OpenMP时某些算法的性能加速,其中一个算法没有缩放.难道我做错了什么?

电脑详情:

  • 记忆: 7,7 GiB
  • 处理器:英特尔®酷睿™i7-4770 CPU @ 3.40GHz×8
  • 操作系统: Ubuntu 15.04 64位
  • gcc: gcc(Ubuntu 4.8.2-19ubuntu1)4.8.2

码:

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

int main(int argc, char **argv) {
  int test_size, i;
  double *vector, mean, stddeviation, start_time, duration;

  if (argc != 2) {
    printf("Usage: %s <test_size>\n", argv[0]);
    return 1;
  }

  srand((int) omp_get_wtime());

  test_size = atoi(argv[1]);
  printf("Test Size: %d\n", test_size);

  vector = (double *) malloc(test_size * sizeof(double));
  for (i = 0; i < test_size; i++) {
    vector[i] = …
Run Code Online (Sandbox Code Playgroud)

c openmp

12
推荐指数
1
解决办法
275
查看次数

拥有更多OpenMP线程比工作对性能有何影响?

请考虑以下示例,其中各个作业是独立的(线程之间不需要同步):

#pragma omp parallel num_threads(N)
{
    #pragma omp for schedule(dynamic) nowait
    for (int i = 0; i < jobs; ++i)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果N = 4jobs = 3我怀疑会有太大的性能损失,以具有额外的线程创建和销毁,但如果N = 32当时我不知道有关创建/销毁未使用的线程的影响.这是我们应该担心的吗?

c++ multithreading openmp

12
推荐指数
1
解决办法
330
查看次数

为什么编译器在循环中从内存加载此指针

我试图确定std::atomic在我的系统(八核x64)上无条件内存写入的开销.这是我的基准程序:

#include <atomic>
#include <iostream>
#include <omp.h>

int main() {
    std::atomic_int foo(0); // VERSION 1
    //volatile int foo = 0; // VERSION 2

    #pragma omp parallel
    for (unsigned int i = 0; i < 10000000; ++i) {
        foo.store(i, std::memory_order_relaxed); // VERSION 1
        //foo = i; // VERSION 2
    }

    std::cout << foo << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

该程序将按原样进行基准测试std::atomic_int,并对标记VERSION 1的行进行注释并取消注释标记的VERSION 2行将volatile int在其位置进行测试.即使不同步,两个程序的输出也应为10000000 - 1.

这是我的命令行:

g++ -O2 -std=c++11 -fopenmp test.c++
Run Code Online (Sandbox Code Playgroud)

atomic_int在我的系统上使用的版本需要2到3秒,而使用的版本volatile …

c++ performance multithreading atomic openmp

12
推荐指数
1
解决办法
282
查看次数

在不同的内存位置同时编写std :: deque是否是线程安全的?

std::deque<std::pair<CustomObj, int>>启动并发块时,我的大小不会改变.

并发块读取每个CustomObjdeque并设置int.

我可以保证deque不会改变大小因此它不会重新分配,并且每个线程只会访问deque的内存块而不是其他线程的内存块.

是否会导致未定义的行为同时读写?我应该把写作和阅读放在互斥区吗?

c++ multithreading openmp c++11

12
推荐指数
2
解决办法
534
查看次数