Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenACC嵌套循环依赖项错误_C++_Parallel Processing_Cuda_Openacc_Pgi - Fatal编程技术网

C++ OpenACC嵌套循环依赖项错误

C++ OpenACC嵌套循环依赖项错误,c++,parallel-processing,cuda,openacc,pgi,C++,Parallel Processing,Cuda,Openacc,Pgi,请,我需要一些使用OpenACC并行计算模型(C++)的帮助。问题如下: VAIRABLE W、hbias、vbias(应获得每次迭代的更新)和PROUP和propdown函数中的计算方法之间存在依赖关系,但通过在不可用的代码上使用OpenACC。所以每个迭代函数都会得到W的初始值和偏差。请注意,如果并行化发生在较低的级别,它将不会得到好处。代码如下: void RBM::contrastive_divergence(int ** train_X, double learning_rat

请,我需要一些使用OpenACC并行计算模型(C++)的帮助。问题如下:

VAIRABLE W、hbias、vbias(应获得每次迭代的更新)和PROUP和propdown函数中的计算方法之间存在依赖关系,但通过在不可用的代码上使用OpenACC。所以每个迭代函数都会得到W的初始值和偏差。请注意,如果并行化发生在较低的级别,它将不会得到好处。代码如下:

    void RBM::contrastive_divergence(int ** train_X, double learning_rate, int k) {


    int * input = new int[n_visible];

    double *ph_mean = new double[n_hidden];
    int *ph_sample = new int[n_hidden]; // CALUCLATED WITHIN COMPLETE CODE
    double *nv_means = new double[n_visible];
    int *nv_samples = new int[n_visible]; //CALUCLATED WITHIN COMPLETE CODE
    double *nh_means = new double[n_hidden];
    int *nh_samples = new int[n_hidden]; //CALUCLATED WITHIN COMPLETE CODE


    #pragma acc parallel 
    {

    #pragma acc loop gang private(input[0:n_visible],ph_mean[0:n_hidden],ph_sample[0:n_hidden], \
    nv_means[0:n_visible], nv_samples[0:n_visible], nh_means[0:n_hidden], \
    nh_samples[0:n_hidden])

    for (int ii = 0; ii<train_N; ii++) {

    #pragma acc loop vector
    for (int j = 0; j< n_visible; j++)
    input[j] = train_X[ii][j];


    sample_h_given_v(input, ph_mean);

    sample_v_given_h(h0_sample, nv_means);
    sample_h_given_v(nv_samples, nh_means);

        #pragma acc loop vector
        for (int i = 0; i<n_hidden; i++) {
            for (int j = 0; j<n_visible; j++) {
            #pragma acc atomic update
            W[i][j] += learning_rate * (ph_mean[i] * input[j] - nh_means[i] * nv_samples[j]) / N;
            }
        #pragma acc atomic update
        hbias[i] += learning_rate * (ph_sample[i] - nh_means[i]) / N;
        }

        #pragma acc loop vector
        for (int i = 0; i<n_visible; i++) {
        #pragma acc atomic update
        vbias[i] += learning_rate * (input[i] - nv_samples[i]) / N;
        }

    }

    }

    delete[] input;
    delete[] ph_mean;
    delete[] ph_sample;
    delete[] nv_means;
    delete[] nv_samples;
    delete[] nh_means;
    delete[] nh_samples;

    }

    #pragma acc routine vector
    void RBM::sample_h_given_v(int *v0_sample, double *mean){

        #pragma acc loop vector
        for (int i = 0; i<n_hidden; i++) {
            mean[i] = propup(v0_sample, W[i], hbias[i]);
        }
    }




    #pragma acc routine vector
    void RBM::sample_v_given_h(int *h0_sample, double *mean){

            #pragma acc loop vector
            for (int i = 0; i < n_visible; i++) {
                mean[i] = propdown(h0_sample, i, vbias[i]);
            }
    }


    #pragma acc routine seq
    double RBM::propup(int *v, double *w, double b) {
    double pre_sigmoid_activation = 0.0;
    for (int j = 0; j<n_visible; j++) {
    pre_sigmoid_activation += w[j] * v[j];
    }
    pre_sigmoid_activation += b;

    double x;
    x = 1.0 / (1.0 + exp(-pre_sigmoid_activation));

    return x;
    }

    #pragma acc routine seq
    double RBM::propdown(int *h, int i, double b) {
    double pre_sigmoid_activation = 0.0;
    for (int j = 0; j<n_hidden; j++) {
    pre_sigmoid_activation += W[j][i] * h[j];
    }
    pre_sigmoid_activation += b;

    double x;
    x = 1.0 / (1.0 + exp(-pre_sigmoid_activation));
    return x;
    }
void RBM::对比差异(int**train\u X,双学习率,int k){
int*input=新的int[n_可见];
double*ph_mean=新的double[n_hidden];
int*ph_sample=newint[n_hidden];//在完整代码中计算
double*nv_表示新的双精度[n_可见];
int*nv_samples=newint[n_可见];//在完整代码中计算
double*nh_意味着=新的double[n_隐藏];
int*nh_samples=new int[n_hidden];//在完整代码中计算
#布拉格行政协调会平行
{
#pragma acc循环组专用(输入[0:n_可见]、ph_平均值[0:n_隐藏]、ph_样本[0:n_隐藏]\
nv_表示[0:n_可见],nv_样本[0:n_可见],nh_表示[0:n_隐藏]\
nh_样本[0:n_隐藏])
对于(intii=0;ii如何在“#pragma acc loop vector”中添加“independent”子句”?
在顶部使用“#pragma acc parallel”。

因此,您有责任表达依赖关系或确保结果的正确性。

如果您想增加有人帮助您的机会,最好格式化代码并使其可读。如果您想要返回某些内容,请尽最小努力。