OpenACC 嵌套循环依赖关系错误
OpenACC nested loop dependency error
拜托,我需要一些关于使用OpenACC并行计算模型(C++)的帮助。问题如下:
在 vairables W、hbias、vbias(它应该得到每次迭代的更新)和 propup 和 propdown 函数内的计算手段之间存在依赖关系,但通过在不可用的代码上使用 OpenACC 来。因此,每个迭代函数都会得到 W 的初始 vlue 和偏差。请注意,如果并行化发生在较低级别,则不会获得好处。这是代码:
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;
}
将"独立"子句添加到"#pragma acc 循环向量"怎么样?您在顶部使用"#pragma acc parallel"。因此,您有责任表达依赖关系或确保结果的正确性。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- OpenACC 嵌套循环依赖关系错误
- Windows上的CMake-zlib依赖关系错误
- dpkg-shlibdeps:错误:未找到依赖关系信息
- 链接器错误:模板关系运算符
- 大量的页面错误与内存碎片有任何关系
- 使用atoi时的依赖关系和错误
- 在基类和扩展类之间存在关系的情况下,没有匹配函数错误
- c++中类关系中的错误
- C++错误:类与同一头文件中的结构有关系