openmp.exe中0x00007FF6021F251F处引发异常:0xC0000005:访问冲突读取位置0x00000000000000F0。开放式mp 我试图在C++程序中使用开放的MP使用并行代码。 没有openmp的代码运行良好。 当并行代码被解决时,我在第65行和第66行看到了这种崩溃

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****

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**** 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)]。