- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个程序可以将作为字符 vector 提供的 2 个大数相乘。现在我必须确保它使用 OpenMP。我有嵌套循环的问题,如果我使用它们,结果不是我所期望的。非常感谢您的帮助。这是代码
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<omp.h>
#include<time.h>
#define MAX 100000
char * multiply(char [],char[], int manyThreads);
int main(){
//omp_set_dynamic(1);
omp_set_nested(1);
omp_set_num_threads(8);
char a[MAX];
char b[MAX];
char *c;
printf("First number : ");
scanf("%s",a);
printf("Second number : ");
scanf("%s",b);
printf("Result : ");
double start = omp_get_wtime( );
c = multiply(a,b,1);
printf("%s\n",c);
double end = omp_get_wtime( );
printf("Calculation time = %.16g\n", end - start);
return 0;
}
char * multiply(char a[],char b[], int manyThreads){
static char result[MAX];
char tempResult[MAX];
char temp[MAX];
int aLength,bLength;
int i,j,k=0,x=0,y;
long int r=0;
long sum = 0;
aLength=strlen(a)-1;
bLength=strlen(b)-1;
#pragma omp parallel if(manyThreads == 1)
{
#pragma omp for schedule(dynamic) nowait
for(i=0;i<=aLength;i++)
{
a[i] = a[i] - 48;
}
#pragma omp for schedule(dynamic) nowait
for(i=0;i<=bLength;i++)
{
b[i] = b[i] - 48;
}
}
#pragma omp parallel if(manyThreads == 1)
{
#pragma omp for schedule(dynamic)
for(i=bLength;i>=0;i--)
{
r=0;
#pragma omp parallel
{
#pragma omp for schedule(dynamic)
for(j=aLength;j>=0;j--)
{
temp[k++] = (b[i]*a[j] + r)%10;
r = (b[i]*a[j]+r)/10;
}
}
temp[k++] = r;
x++;
#pragma omp parallel
{
#pragma omp for schedule(dynamic)
for(y = 0;y<x;y++)
{
temp[k++] = 0;
}
}
}
}
k=0;
r=0;
#pragma omp parallel if(manyThreads == 1)
{
#pragma omp for schedule(dynamic)
for(i=0;i<aLength+bLength+2;i++)
{
sum =0;
y=0;
#pragma omp parallel
{
#pragma omp for schedule(dynamic)
for(j=1;j<=bLength+1;j++)
{
if(i <= aLength+j)
{
sum = sum + temp[y+i];
}
y += j + aLength + 1;
}
}
tempResult[k++] = (sum+r) %10;
r = (sum+r)/10;
}
}
tempResult[k] = r;
j=0;
#pragma omp parallel if(manyThreads == 1)
{
#pragma omp for schedule(dynamic)
for(i=k-1;i>=0;i--)
{
result[j++]=tempResult[i] + 48;
}
}
result[j]='\0';
if(result[0]==48)
{
result[0]=255;
}
return result;
}
最佳答案
我可以确认,你有一些数据竞争错误。
没有 OpenMP:
First number : 123456
Second number : 654321
Result : 08563613376
Calculation time = 0.005543371655221563
使用 OpenMP:
First number : 123456
Second number : 654321
Result : 00000000825
Calculation time = 0.007188999978097854
我并没有解决整个问题,但根据我所看到的,我有一些评论。
首先我会说你应该在 for 构造中指定 for
变量
#pragma omp for schedule(dynamic) nowait
for(int i=0;i<=aLength;i++)
{
a[i] = a[i] - 48;
}
以及您(每次)犯下的主要错误的示例……当您进入平行区域时,您必须注意您的变量。什么是共享的,什么是每个线程私有(private)的?在你的结束循环中,你不使用嵌套并行性
,但你在每个线程中执行了一个j++
,所以你应该像下面这样保护 j。
#pragma omp parallel if(manyThreads == 1) shared(j)
{
int pos;
#pragma omp for schedule(dynamic)
for(int i=k-1;i>=0;i--)
{
#pragma omp atomic capture
pos = j++;
result[pos]=(tempResult[i] + 48);
}
}
请注意,您还忘记了 OpenMP for
构造具有 reduction
子句
所以你计算 sum += temp[y+i]
的 for 循环可以用
#pragma omp for schedule(dynamic) reduction(+:sum)
并且您必须遵循所有算法逻辑,以在每个周围和嵌套的 parallel
区域上使用 shared
和 private
子句。
关于c - OMP C 中的嵌套 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18299693/
好的,我希望以前没有问过这个问题,因为在搜索中很难找到。 我查看了 F95 手册,但仍然觉得这很模糊: For the simple case of: DO i=0,99 END DO 我正
这两者有什么区别? [一] #pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) {
这两者有什么区别? [一] #pragma omp parallel { #pragma omp for for(int i = 1; i < 100; ++i) {
我有这段代码: #include #include int main(){ int i,j = 0 ; int tid; # pragma omp parallel pri
刚开始接触OPENMP,想用它来求解波动方程,串口代码在这里: #include #include #include #include #define GRID_SZ 3000 #define
我对 omp single 感到困惑和 omp task指令。我已经阅读了几个使用它们的例子。以下示例显示如何使用任务构造来处理链表的元素。 1 #pragma omp parallel 2 {
我试图了解 omp ordered 和 omp critical 之间的区别。他们都没有相同的语义吗?每个线程中编写的代码都被串行执行,当一个线程处于有序/关键 block 中时,其他线程等待。我看不
是否可以在 omp 并行 block 之外使用 omp pragma,如 critical、single、master 或 barrier?我有一个函数可以从 OMP 并行 block 调用,也可以不
我想测试 #pragma omp parallel for 和 #pragma omp simd 一个简单的矩阵加法程序。当我分别使用它们时,我没有收到任何错误,而且看起来还不错。但是,我想测试使用它
考虑: void saxpy_worksharing(float* x, float* y, float a, int N) { #pragma omp parallel for
我试图了解 #pragma omp critical 之间的确切区别和 #pragma omp single在 OpenMP 中: Microsoft 对这些的定义是: Single:让您指定应在其上
在带有 openMP 的 C++ 中,两者之间有什么区别吗 #pragma omp parallel for for(int i=0; i
我正在处理一些事情,试图让孤立工作发挥作用,并通过减少 #pragma omp parallel 的调用来减少开销。我正在尝试的是这样的: #pragma omp parallel default(n
在我学习 OpenMP 的过程中,我遇到了一个示例,其中的主要内容如下所示: int main(){ #pragma omp parallel #pragma omp sing
我是 OpenMP 的新手,我一直在尝试运行一个使用 OpenMP 添加两个数组的程序。在 OpenMP 教程中,我了解到,在 for 循环上使用 OpenMP 时,我们需要使用 #pragma om
我正在阅读 Peter S. Pacheco 的《并行编程简介》一书。在第 5.6.2 节中,它对减少 fork/join 开销进行了有趣的讨论。 考虑奇偶转置排序算法: for(phase=0; p
之间有什么区别: #pragma omp for {for_loop} 和 #pragma omp parallel for {for_loop} 最佳答案 #pragma omp par
在 OpenMP 中 #pragma omp master 中的任何代码指令由单个线程(主线程)执行,在区域末尾没有隐含的屏障。 (见 section on MASTER directive in t
如果我明白 aligned omp simd的条款构造,它指的是整个数组的对齐方式。 它如何用于多维数组?认为 ni = 131; nj = 137; nk = 127 !allocates arr
我有一个问题:我必须使用 OMP 并行化这段代码。 存在数据依赖问题,不知道如何解决。有什么建议么? for (n = 2; n < N+1; n++) { dz = *(dynamic_d +
我是一名优秀的程序员,十分优秀!