openmp.exe中0x00007FF6021F251F处引发异常:0xC0000005:访问冲突读取位置0x00000000000000F0。开放式mp 我试图在C++程序中使用开放的MP使用并行代码。 没有openmp的代码运行良好。 当并行代码被解决时,我在第65行和第66行看到了这种崩溃
openmp.exe中0x00007FF6021F251F处引发异常:0xC0000005:访问冲突读取位置0x0000000000000000 我的代码是:openmp.exe中0x00007FF6021F251F处引发异常:0xC0000005:访问冲突读取位置0x00000000000000F0。开放式mp 我试图在C++程序中使用开放的MP使用并行代码。 没有openmp的代码运行良好。 当并行代码被解决时,我在第65行和第66行看到了这种崩溃,c++,openmp,C++,Openmp,openmp.exe中0x00007FF6021F251F处引发异常:0xC0000005:访问冲突读取位置0x0000000000000000 我的代码是: #include <stdio.h> #include <iostream> #include <omp.h> #include <math.h> #include <Windows.h> using namespace std; int i, j, m; double****
#include <stdio.h>
#include <iostream>
#include <omp.h>
#include <math.h>
#include <Windows.h>
using namespace std;
int i, j, m;
double**** g, **** f;
int n = 50;
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
LARGE_INTEGER Frequency;
int main()
{
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&StartingTime);
f = new double*** [n];
g = new double*** [n];
for (int i = 0; i < n; i++)
{
f[i] = new double** [n];
g[i] = new double** [n];
for (int j = 0; j < n; j++)
{
f[i][j] = new double* [n];
g[i][j] = new double* [n];
for (int k = 0; k < n; k++)
{
f[i][j][k] = new double[n];
g[i][j][k] = new double[n];
}
}
}
# pragma omp parallel
{
m = omp_get_num_procs();
printf("number of processor= %d \n", m);
m = omp_in_parallel();
printf("if program in paralle=1 or serial=0 ?? %d \n", m);
m = omp_get_max_threads();
printf("muaximum number of thread= %d \n", m);
m = omp_get_num_threads();
printf("number of threads= %d \n", m);
m = omp_get_thread_num();
printf("thread number is= %d \n", m);
#pragma omp for schedule (static,10)
for(i=0 ; i <n ;i++)
for (j = 0; j < n; j++)
for(int k=0;k<n;k++)
for(int a=0;a<n;a++)
{
f[i][j][a][k] = 1;
g[i][j][a][k] = 2;
}
}
QueryPerformanceCounter(&EndingTime);
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
ElapsedMicroseconds.QuadPart *= 1000000000;
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
cout << "time : " << ElapsedMicroseconds.QuadPart << endl;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int i,j,m;
双****g、****f;
int n=50;
大整数开始时间、结束时间、经过的微秒;
大整数频率;
int main()
{
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&StartingTime);
f=新双***[n];
g=新双***[n];
对于(int i=0;i 对于(i=0;我从double g[50][50][50],f[50][50][50]开始
再加上摆脱所有这些动态分配。确保这一点有效,然后继续。被称为a不是一种恭维。你是一个四星程序员。请不要这样做。你的代码的一个问题是,i
、j
和k
变量在并行区域内共享。你需要私有的循环的中的变量。此处根本不使用全局变量。在中声明循环的变量(int i=…
。@goodvibration在堆栈上放置100MB可能不是一个好主意。这将导致实际的堆栈溢出。也就是说,这种动态分配n>1维对象的方式是最糟糕的方式。您希望在每个对象的一次分配中分配所有需要的内存(使用std::vector获得良好的样式)然后使用字典索引(f[i][j][a][k]应翻译为f[((i*n+j)*n+a)*n+k])。理想情况下,将此索引计算打包为函数或类似函数,即f[idx(i,j,a,k)]。