- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
拜托,我需要一些关于使用 OpenACC 并行计算模型(C++)的帮助。问题如下:
vairables W、hbias、vbias(它应该得到每次迭代的更新)和 propup 和 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;
}
最佳答案
如何在“#pragma acc loop vector”中添加“独立”子句?您在顶部使用“#pragma acc parallel”。因此,您有责任表达依赖关系或确保结果的正确性。
关于c++ - OpenACC 嵌套循环依赖错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41885101/
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
#include #include #include #include #include #define THR 10 //Function to test if the output is i
General Information 注意:我对 C、OpenAcc 来说也是个新手。 您好,我正在尝试开发一个图像模糊程序,但首先我想看看是否可以并行化 for 循环和 copyin/copyou
我正在尝试使用 OpenACC 将现有 C 代码卸载到 GPU。在原始的CPU代码中,很多时候需要根据某个参数的值来选择一个数据数组。下面给出了示例 CPU 代码: #include #includ
拜托,我需要一些关于使用 OpenACC 并行计算模型(C++)的帮助。问题如下: vairables W、hbias、vbias(它应该得到每次迭代的更新)和 propup 和 propdown 函
我正在尝试为许多 body 模拟进行 openACC 优化。目前,我正面临导致以下内存问题的问题 call to cuStreamSynchronize returned error 700: Ill
如何在主机 CPU 和 GPU 之间交换二维元素?我尝试将此 2d 元素用作 w[0:(n_hidden*i)-1],但编译器反馈告诉我有问题 这是RBM算法函数: double RBM::propd
我在 C++ 中使用 OpenACC 进行稀疏矩阵计算。我需要在 OpenACC 区域内使用矩阵运算。 是否有与 OpenACC 兼容的稀疏矩阵库? 我用惯了 Eigen,但好像不兼容 OpenACC
我正在研究 LU decomposition的 block diagonal matrices使用 OpenACC。 当我按顺序运行我的代码时,我得到了正确的分解,而当我在 OpecACC 指令下执行
我有一个 C 程序来查找两组多边形是否重叠。用户输入 2 组多边形(每组数据有数千个多边形),程序查看 set1 中的哪个多边形与 set2 中的哪个多边形重叠 我有两个这样的结构: struct g
我想开始开发 OpenACC 程序,我有几个问题要问:是否可以在 AMD gpu 上执行 OpenACC 代码? 如果是这样,我正在寻找适用于 Windows 环境的编译器。我花了将近一个小时什么也没
当我在顶层循环中有一个内核时,为什么我不能使用这 2 个指令: #pragma acc update device(hbias[0:n_hidden],W[0:n_hidden][0:n_visibl
您好,我测试了 OpenACC vs OpenMP vs Nothing,但我得到了奇怪的结果。 代码: #include int main () { int
是否有任何 OpenAcc 编译器支持将包含可分配数组的派生类型复制到 GPU 或从 GPU 复制它们并在加速代码中使用它们? OpenACC 规范 (v2.0) 指出这是可能的,但我无法在任何地方的
我正在学习 OpenACC(使用 PGI 的编译器)并尝试优化矩阵乘法示例。到目前为止,我提出的最快的实现如下: void matrix_mul(float *restrict r, float *a
我是 openacc 的新手,只有高级知识,所以任何帮助和解释我做错的事情都将不胜感激。 我正在尝试加速(并行化)一个不太直接的嵌套循环,该循环使用 openacc 指令更新扁平化(3D 到 1D)数
我正在尝试使用共享内存来缓存 OpenACC 中的内容。 基本上我正在做的是矩阵乘法,我所拥有的是: typedef float ff; // Multiplies two square row-ma
我编写了一个涉及四个嵌套 for 循环的串行方法 - 我想使用 OpenACC 并行化此方法(这是我第一次尝试使用它,我对所有指令都不是很熟悉)。 我尝试了以下操作,但看到以下错误:调用 cuStre
我正在尝试编写一个与 OpenACC 并行的面向对象的 C++ 代码。我能够在 OpenACC 上找到一些 stackoverflow 问题和 GTC 讨论,但找不到面向对象代码的一些真实示例。 在t
OpenACC 有一些编译指示和运行时例程,可用于基本实现相同的事情。 例如有#pragma acc wait和acc_wait()或者#pragma acc update [...]和acc_upd
我是一名优秀的程序员,十分优秀!