- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个基于 BiCCG(共轭梯度)的矩阵求解器的实现,它也考虑了周期性。碰巧的是,实现是计算密集型的,并且由于依赖性问题,循环没有自动向量化。我进行了一些探索,似乎红黑高斯赛德尔算法比原始版本(也有类似的依赖问题)更有效地并行化。
是否可以更改此循环/算法以便对其进行有效矢量化?
// FORWARD
#pragma omp for schedule(static, nx/NTt)
for (i=1; i<=nx; i++) for (j=1; j<=ny; j++) for (k=1; k<=nz; k++)
{
dummy = res_sparse_s[i][j][k];
dummy -= COEFF[i][j][k][7] * RLL[i-1][j][k];
if (PeriodicBoundaryX && i==nx)dummy -= COEFF[i][j][k][8] * RLL[1 ][j][k];
dummy -= COEFF[i][j][k][2] * RLL[i][j-1][k];
if (PeriodicBoundaryY && j==ny) dummy -= COEFF[i][j][k][3] * RLL[i][1 ][k];
dummy -= COEFF[i][j][k][4] * RLL[i][j][k-1];
if (PeriodicBoundaryZ && k==nz) dummy -= COEFF[i][j][k][5] * RLL[i][j][1 ];
RLL[i][j][k] = dummy / h_sparse_s[i][j][k];
}
附言任何迭代 i,j,k 的 RLL 通过变量 dummy 在 i-1 、 j-1 和 k-1 合并更新的“RLL”。此外,现在仅使用指令 schedule(static, nx/NTt)
在 x 方向上分解循环,其中 NTt 只是可用线程数的宏。是否可以使用指令 collapse
在所有方向上分解它?
-------- 主要编辑------------------------以下是 Ajay 的回答,这是一个最低限度的工作示例
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<omp.h>
typedef double lr;
#define nx 4
#define ny 4
#define nz 4
void
print3dmatrix(double a[nx+2][ny+2][nz+2])
{
for(int i=1; i<= nx; i++) {
for(int j=1; j<= ny; j++) {
for(int k=1; k<= nz; k++) {
printf("%f ", a[i][j][k]);
}
printf("\n");
}
printf("\n");
}
}
int
main()
{
double a[nx+2][ny+2][nz+2];
double b[nx+2][ny+2][nz+2];
srand(3461833726);
// matrix filling
// b is just a copy of a
for(int i=0; i< nx+2; i++) for(int j=0; j< ny+2; j++) for(int k=0; k< nz+2; k++)
{
a[i][j][k] = rand() % 5;
b[i][j][k] = a[i][j][k];
}
// loop 1
//#pragma omp parallel for num_threads(1)
for(int i=1; i<= nx; i++) for(int j=1; j<= ny; j++) for(int k=1; k<= nz; k++)
{
a[i][j][k] = -1*a[i-1][j][k] - 1*a[i][j-1][k] -1 * a[i][j][k-1] + 4 * a[i][j][k];
}
print3dmatrix(a);
printf("******************************\n");
// loop 2
//#pragma omp parallel for num_threads(1)
for(int i=1; i<= nx; i++)
for(int j=1; j<= ny; j++)
// #pragma omp simd
for(int m=j+1; m<= j+nz; m++)
{
b[i][j][m-j] = -1*b[i-1][j][m-j] - 1*b[i][j-1][m-j] -1 * b[i][j][m-j-1] + 4 * b[i][j][m-j];
}
print3dmatrix(b);
printf("=========================\n");
return 0;
}
主要观察结果-
#pragma omp simd
用于强制执行最内层循环的矢量化,则会失败。最佳答案
这是循环携带依赖的经典问题。您的每个迭代都依赖于其他一些迭代(完成),因此唯一可以安排的方式是串行。
但这只是因为你的循环是如何编写的。
你提到 R[i][j][k]
取决于 R[i-1][j][k]
的计算,R[i][j-1][k]
,R[i][j][k-1]
。我在这里看到三个依赖 -
我希望这种表示是直观的。
对于您当前的场景,依赖 1) 和 2) 不是问题,因为 k
中有一个 0
并且有 1
在i
/j
中,这意味着对于这两个依赖,本次迭代并不依赖k的前几次迭代来完成。
问题是因为3)。由于 k
中有一个 1
,因此每次迭代都取决于它的前一次迭代。如果我们能够以某种方式在 i
/j
中输入一个数字 >0
,我们就完成了。循环倾斜变换让我们可以做完全相同的事情。
3D 例子有点难理解。因此,让我们看一下带有 i
和 j
的二维示例。
假设 - R[i][j]
依赖于 R[i-1][j]
和 R[i][j-1]
。我们有同样的问题。
如果我们必须用图片表示它,它看起来像这样 -
. <- . <- .
| |
v v
. <- . <- .
| |
v v
. . .
在这张图中,每个点代表迭代(i,j)
,每个点的箭头指向它所依赖的迭代。很清楚为什么我们不能在这里并行化最内层的循环。
但假设我们将偏斜作为 -
.
/|
/ |
. .
/| /|
/ | / |
. . .
/|
/ |
. .
.
如果你绘制与上图相同的箭头(我无法在 ASCII 艺术中绘制对角线箭头)。
您会看到所有箭头都指向下方,即它们至少会向下迭代,这意味着您可以并行化水平循环。
现在假设您的新循环维度是 y
(外循环)和 x
(内循环),
你原来的变量i
,j
会是
j = x
和 i = x - y
你的循环体因此变成 -
for ( y = 0; y < j_max + i_max; y++)
for ( x = 0; x < j_max; x++)
R_dash[y][x] = R_dash[y-1][x-1] + R_dash[y-1][x];
其中 R_dash
是倾斜域并且与 R
一对一映射
您会看到 R_dash[y-1][x-1]
和 R_dash[y-1][x]
都将在之前的迭代中计算y。因此,您可以完全并行化 x 循环。
这里应用的转换是
i -> i, j -> i + j
.
您可以类似地计算 3 个维度。
要进一步了解仿射变换的工作原理以及它们如何用于引入并行性,您可以查看这些 lecture notes .
关于c - 具有数据依赖性的 for 循环向量化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51580852/
我想使用Tensorflow的transform_graph工具优化图形。我尝试优化 MultiNet 中的图表(以及其他具有类似编码器-解码器架构的)。然而,优化后的图在使用 quantize_we
我试图在 C# 中将图像量化为 10 种颜色,但在绘制量化图像时遇到问题,我已经制作了映射表并且它是正确的,我已经制作了原始图像的副本并且正在更改基于映射表的像素颜色,我使用下面的代码: bm = n
我需要降低UIImage的颜色深度,但是我不知道该怎么做。结果应与在Photoshop中应用索引颜色相同。 我的目标是要具有较低的色深(32色或更低)。也许这是我的错,但我没有找到解决方法。令人惊讶的
我有大量的 numpy 向量,每个形状 (3,) 都有 8 位整数值: vec = np.random.randint(2**8, size=3) 我想通过一些已知的缩减因子将这些向量量化到更小的空间
我正在用 jQuery 编写一个心理学应用程序。我的项目的一部分需要测量用户对声音的 react 时间(用户按下一个键)。因此,我需要在调用(&时间戳)声音文件和实际开始播放之间的延迟尽可能小地播放声
最近,我开始使用 Tensorflow + Keras 创建神经网络,我想尝试 Tensorflow 中提供的量化功能。到目前为止,使用 TF 教程中的示例进行试验效果很好,我有这个基本的工作示例(来
使用当前的 Tensorflow quantization ops ,我将如何在推理过程中模拟每 channel 量化?这paper将每层量化定义为 We can specify a single q
我已经卡住了我的模型并获得了 .pb 文件。然后我在 Linux 上使用 tocoConverter 量化我的模型,因为 Windows 不支持它。我有 quantized_model.tflite。
我将 git 用于一个稍微不寻常的目的——它在我写小说时存储我的文本。 (我知道,我知道......令人讨厌。) 我正在尝试跟踪生产力,并想衡量后续提交之间的差异程度。作家代表“作品”的是“文字”,至
quantization有什么区别和 simplification ? 量化是另一种简化方式吗? 在某些情况下使用量化更好吗? 或者我应该同时使用两者? 最佳答案 几何体的总大小由两个因素控制:点数和
扎克伯格说,Llama3-8B还是太大了,不适合放到手机中,有什么办法? 量化、剪枝、蒸馏,如果你经常关注大语言模型,一定会看到这几个词,单看这几个字,我们很难理解它们都干了些什么,但
相对于
我正在将一些我无法控制的 XML 转换为 XHTML。 XML 模式定义了一个 段落标记和 和 用于列表。 我经常在这个 XML 中找到嵌套在段落中的列表。因此,直接转换会导致 s 嵌套在 中s,
我看到过这样的说法:CNN 的更深层次可以学习识别更复杂的特征。这通常附带一张早期过滤器识别直线/简单曲线的图片,以及后期过滤器识别更复杂图案的图片。它具有直观意义:您距离数据越远,您对数据的理解就越
在使用 C++ 的带有 tensorflow lite 的树莓派上,对象检测无法正常工作。我的代码编译并运行,但输出似乎从未得到正确填充。我是否会遗漏任何依赖项或错误地访问结果? 我遵循了以下教程:
如何衡量/量化 Corona SDK 游戏应用中的“迟缓”? 我在我构建的基于 Corona SDK 的物理游戏(使用 Box2D)上寻找旧手机(例如 iPhone 4、Samsung GT-I900
我正在尝试创建一个 Tensorflow 量化模型,以便使用 Coral USB 加速器进行推理。这是我的问题的一个最小的独立示例: import sys import tensorflow as t
我有一个分位数回归模型,其中包含 1 个回归变量和 1 个回归变量。我想假设检验回归量在每个分位数上都相等。我想到的一种方法是在 {0.01,0.02,....,0.99} 上测试所有 tau。但是,
要求做,在 PGM 文件上使用 KMeans 进行 vector 量化(或图像压缩) 图像是 PMG 文件,其中 b = block 大小,k = 次数,t = 迭代,-g = 初始质心 图像是这样的
我是一名优秀的程序员,十分优秀!