Tag: openmp

OpenMP:并行运行两个函数,每个函数占线程池的一半

我有一个CPU消耗函数do_long ,我需要在两个不同的数据集上运行。 do_long(data1); do_long(data2); do_long() { #pragma omp for for(…) { // do proccessing } } 我有N个线程可用(取决于机器)。 如何告诉OpenMP我想要do_long函数并行运行,N / 2线程应该在第一个do_long执行循环而另一个N / 2应该处理第二个do_long ?

使用c进行OpenMP优化

我应该优化下面的代码,使其使用openMP和内存阻塞运行至少16倍。 到目前为止,我只能想到使用下面的简单语句来折叠for循环。 这使它运行速度提高了3倍。 有什么想让它接近16? int i,j; #pragma omp parallel for collapse(2) //my inserted code for (i = 0; i < MSIZE; i++) for (j = 0; j < MSIZE; j++) d[i][j] = c[j][i];

从OpenMP到MPI

我只是想知道如何将以下openMP程序转换为MPI程序 #include #define CHUNKSIZE 100 #define N 1000 int main (int argc, char *argv[]) { int i, chunk; float a[N], b[N], c[N]; /* Some initializations */ for (i=0; i < N; i++) a[i] = b[i] = i * 1.0; chunk = CHUNKSIZE; #pragma omp parallel shared(a,b,c,chunk) private(i) { #pragma omp for schedule(dynamic,chunk) nowait for (i=0; […]

OpenMp检测并行区域之前嵌套并行性中的线程数

如何在并行区域启动之前检测OpenMp中的线程数? 如果我使用嵌套并行性,则环境变量OMP_NUM_THREADS看起来像4,64 。 get_nested_num_threads(); #pragma omp parallel { // starting 4 threads #pragma omp parallel { // starting 64 threads for each of the 4 } } 这个答案导致我使用以下代码查询OMP_NUM_THREADS : #include #include int get_nested_num_threads(){ char delimiter[] = “,”; char *ptr = NULL; char *num_threads = NULL; num_threads = getenv(“OMP_NUM_THREADS”); int threads=1, nested=0; ptr = strtok(num_threads, delimiter); […]

OpenMP最小值数组

我有原始代码: min = INT_MAX; for (i=0;i<N;i++) if (A[i]<min) min = A[i]; for (i=0;i<N;i++) A[i]=A[i]-min; 我想得到这个的并行版本,我做了这个: min = INT_MAX; #pragma omp parallel private(i){ minl = INT_MAX; #pragma omp for for (i=0;i<N;i++) if (A[i]<minl) minl=A[i]; #pragma omp critical{ if (minl<min) min=minl; } #pragma omp for for (i=0;i<N;i++) A[i]=A[i]-min; } 并行代码是对的吗? 我想知道是否有必要在#pragma omp critical之前编写#pragma omp barrier,以便确保在计算全局最小值之前计算所有最小值。

向量的矩阵乘法OpenMP C

我试图通过C(OpenMP)中的向量乘法来编写Matrix,但是当我添加处理器时我的程序会变慢… 1 proc – 1,3 s 2 proc – 2,6 s 4 proc – 5,47 s 我在我的PC(核心i5)和我们学校的集群上进行了测试,结果相同(程序运行缓慢) 这是我的代码(矩阵是10000 x 10000),矢量是10000: double start_time = clock(); #pragma omp parallel private(i) num_threads(4) { tid = omp_get_thread_num(); world_size = omp_get_num_threads(); printf(“Threads: %d\n”,world_size); for(y = 0; y < matrix_size ; y++){ #pragma omp parallel for private(i) shared(results, vector, matrix) for(i […]

OpenMP中的嵌套循环

我需要运行一个短的外循环和一个长的内循环。 我想将后者并行化,而不是前者。 原因是在内部循环运行后有一个更新的数组。 我正在使用的代码如下 #pragma omp parallel{ for(j=0;j<3;j++){ s=0; #pragma omp for reduction(+:s) for(i=0;i<10000;i++) s+=1; A[j]=s; } } 这实际上是挂起的。 以下工作正常,但我宁愿避免开始一个新的并行区域的开销,因为这之前是另一个。 for(j=0;j<3;j++){ s=0; #pragma omp parallel for reduction(+:s) for(i=0;i<10000;i++) s+=1; A[j]=s; } 这样做的正确(和最快)方式是什么?

在C上使用OpenMP并行一段时间

我想在一段时间内做一个平行,像这样的somothing: while(!End){ for(…;…;…) // the parallel for … // serial code } for循环是while循环的唯一并行部分。 如果我这样做,我会有很多开销: cycles = 0; while(!End){ // 1k Million iterations aprox #pragma omp parallel for for(i=0;i<N;i++) // the parallel for with 256 iteration aprox if(time[i] == cycles){ if (wbusy[i]){ wbusy[i] = 0; wfinished[i] = 1; } } // serial code ++cycles; } for循环的每次迭代都是彼此独立的。 […]

我们可以将此任务并行化吗?

给定一个C字符串(以NULL字符常量终止的字符数组),我们必须找到字符串的长度。 能否为N个执行线程建议一些并行化的方法。 我有问题分为子问题,因为访问不存在的arrays的位置将给出分段错误。 编辑 :我并不担心并行执行此任务可能会带来更大的开销。 只是想知道是否可以这样做(使用类似openmp等的东西)

OpenMP平均数组

我正在尝试为我正在编写的程序学习OpenMP。 对于其中的一部分,我正在尝试实现一个函数来查找大数组的平均值。 这是我的代码: double mean(double* mean_array){ double mean = 0; omp_set_num_threads( 4 ); #pragma omp parallel for reduction(+:mean) for (int i=0; i<aSize; i++){ mean = mean + mean_array[i]; } printf("hello %d\n", omp_get_thread_num()); mean = mean/aSize; return mean; } 但是,如果我运行代码,它运行速度比顺序版本慢。 另外对于我得到的打印声明: hello 0 hello 0 这对我来说没有多大意义,难道不应该有4个hellos吗? 任何帮助,将不胜感激。