我在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/C++源代码中包含omp.h?为什么?或者为什么不呢?当与-fopenmp标志一起使用时,gcc编译器是否默认包含它?它似乎并不是一个不同之处.
我试图找出我的机器上安装了哪个版本的OpenMP.这是我连接使用的Linux盒子ssh.
我正在使用gcc编译-fopenmp.
经过大量搜索c中并行快速排序的实现后,我即将潜入并自己编写代码.(我需要对一个大约100万个文本字符串的数组进行排序.)似乎我发现的所有实现都将qsort函数本身的工作分开,这在分割每个线程相对少量的工作时会产生大量的开销.
将100万个字符串除以线程数(在我的情况下是24个线程)并将它们分别放在一个节上,然后进行合并输出会不会快得多?当然,这具有理论上的缺点,即它不是就地排序,但是随着可用内存的大量存在,这不是问题.运行的机器有12个(非常快)物理/ 24逻辑核心和192 GB(是,千兆字节)的内存.目前,即使在这台机器上,排序也需要大约8分钟!
在OpenMP中,#pragma omp master指令内的任何代码都由单个线程(主控)执行,而在区域末尾没有隐含的屏障.(请参阅LLNL OpenMP教程中有关MASTER指令的部分).
这似乎相当于#pragma omp single nowait(除了'master'之外,任何线程都可以执行单个区域).
在什么情况下,如果有的话,使用#pragma omp master是否有益?
我之前的评论(特别是@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) 我正在测试使用OpenMP时某些算法的性能加速,其中一个算法没有缩放.难道我做错了什么?
#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) 请考虑以下示例,其中各个作业是独立的(线程之间不需要同步):
#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 = 4和jobs = 3我怀疑会有太大的性能损失,以具有额外的线程创建和销毁,但如果N = 32当时我不知道有关创建/销毁未使用的线程的影响.这是我们应该担心的吗?
我试图确定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 …
std::deque<std::pair<CustomObj, int>>启动并发块时,我的大小不会改变.
并发块读取每个CustomObj的deque并设置int.
我可以保证deque不会改变大小因此它不会重新分配,并且每个线程只会访问deque的内存块而不是其他线程的内存块.
是否会导致未定义的行为同时读写?我应该把写作和阅读放在互斥区吗?