- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用以下代码在CUDA中实现大整数加法
__global__ void add(unsigned *A, unsigned *B, unsigned *C/*output*/, int radix){
int id = blockIdx.x * blockDim.x + threadIdx.x;
A[id ] = A[id] + B[id];
C[id ] = A[id]/radix;
__syncthreads();
A[id] = A[id]%radix + ((id>0)?C[id -1]:0);
__syncthreads();
C[id] = A[id];
}
最佳答案
TL; DR建立了一个超前进位加法器,其中每个单独的加法器都将取模数基而不是模2
添加需要进位进位
您的模型中的问题是您有涟漪携带。请参见Rippling carry adders。
如果您使用的是FPGA,那将不是问题,因为它们具有专用的逻辑来快速完成操作(carry chains, they're cool)。但是,a,您使用的是GPU!
也就是说,对于给定的id
,只有在计算了所有具有较小A[id]+B[id]
值的总和后,您才知道输入进位(因此是要对A[id]+B[id]+1
还是id
求和)。实际上,最初,您只知道第一个进位。
A[3]+B[3] + ? A[2]+B[2] + ? A[1]+B[1] + ? A[0]+B[0] + 0
| | | |
v v v v
C[3] C[2] C[1] C[0]
(C, c_out) = add(A, B, c_in)
id
处的所有可能结果。这不是那么大的工作量,因为
A
和
B
不会改变,只有进位。因此,您有2个可能的输出:
(c_out0, C) = add(A, B, 0)
和
(c_out1, C') = add(A, B, 1)
。
P
和
G
的功能:
P
下列所有定义
c_out1 && !c_out0
A + B == radix-1
G
下列所有定义
c_out1 && c_out0
c_out0
A + B >= radix
c_out = G or (P and c_in)
。因此,现在我们有了一个算法的开始,该算法可以轻松地直接为每个id告知进位输出作为其进位输入的函数:
id
上计算
C[id] = A[id]+B[id]+0
G[id] = C[id] > radix -1
P[id] = C[id] == radix-1
G
和一个组
P
:
id
和
id+1
:
step = 2
if id % step == 0, do steps 6 through 10, otherwise, do nothing
group_P = P[id] and P[id+step/2]
group_G = (P[id+step/2] and G[id]) or G[id+step/2]
c_in[id+step/2] = G[id] or (P[id] and c_in[id])
step = step * 2
if step < n, go to 5
id
时),所有内容都将按照您计算出的
P
和
G
以及
c_in[0]
这是
0
。在Wikipedia页面上,有按4而不是2进行分组的公式,这将为您提供O(log_4(n))而不是O(log_2(n))的答案。
id
处获取
c_in[id]
(C[id]+c_in[id]) % radix
P
和
G
定义替换为基于
2
的定义,就像我们硬件中的逻辑一样,在每个阶段模拟2位
a
和
b
的总和:if
P = a ^ b
(逻辑与)。换句话说,
G = a & b
和
a = P or G
。因此,如果我们创建一个
b = G
整数和
intP
整数,其中每个位分别是我们根据每个
intG
的总和(将我们限制为64个总和)计算出的
P
和
G
,则加法< cc>具有与我们精心设计的逻辑方案完全相同的进位传播。
id
的函数。
(intP | intG) + intG
,那么
a+b+c_in % 2
,因此
P == 1
a + b == 1
是
a+b+c_in % 2 == !c_in
或
a+b
,而
0
2
为
a+b+c_in % 2 == c_in
的整数(或位数组)
int_cin = ((P|G)+G) ^ P
。
^
处,将
xor
和
id
移
P
:
G
和
id
P = P << id
和
G = G << id
,它们是
intG
0..63的所有
intP
和
OR
的
P
G
id
处,获取`c_in = int_cin&(1 << id)吗? 1:0;
int_cin = ((P|G)+G) ^ P
id
大,请注意数组中的整数溢出。如果不是这样的话,我猜整个事情就没有意义了...
(C[id]+c_in) % radix
和
radix
为特征,就好像
P
是
G
,然后在更高级别上重新运行相同的步骤(还原,获取
radix
),然后返回较低的级别,将
2^64
与
c_in
关于c - 大整数加法码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27971757/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!