- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 CUDA 的新手,想了解更多关于复数运算及其速度影响的信息。
我需要为“j[]”数组中的所有元素求解以下复数方程并将答案存储在“Ans[]”中:
Ans [0] = (2.0/((20.5*(j[0]*j[0]))+(5.55*j[0])+20));
Ans [1] = (2.0/((20.5*(j[1]*j[1]))+(5.55*j[1])+20));
...
...
...
Ans [n] = (2.0/((20.5*(j[n]*j[n]))+(5.55*j[n])+20));
因为我需要对“j”的所有元素执行相同的计算,所以我可以并行化这段代码并让每个线程/ block 负责每个计算(blockIdx.x = 0 -> Ans [0] 等)据我了解,如果我对很多元素并行执行此操作,我应该能够看到速度的提高。然而,一行c++代码可以写的东西,在GPU中需要几行代码才能完成。
我的问题是,所有额外的代码行是否意味着更长的处理时间,因为它涉及在许多临时中保存中间值。如果是这样,当元素数量少于(比如说)1000 时,在 GPU 中进行此类计算是否仍然有意义? (任意数量)
等式:
C++ -> Ans [0] = (2.0/((20.5*(j[0]*j[0]))+(5.55*j[0])+20));
我的 GPU 版本:
int tid = blockIdx.x;
temp1[tid] = cuCmul(j[tid], j[tid]);
temp2[tid] = cuCmul(temp1[tid], make_cuDoubleComplex(20.5, 0));
temp3[tid] = cuCmul(j[tid], make_cuDoubleComplex(5.55, 0));
temp4[tid] = cuCadd(temp2[tid], temp3[tid]);
temp5[tid] = cuCadd(temp4[tid], make_cuDoubleComplex(20, 0));
Ans[tid] = cuCdiv(make_cuDoubleComplex(2.0, 0), temp5[tid]);
此外,如果有更有效的方式为 GPU 编写此代码,请告诉我
最佳答案
what can be written in one line of c++ code takes a few lines to do in the GPU.
这可能不是真的,至少对于您展示的示例而言是这样。您似乎担心临时存储,但编译器(主机和 GPU)非常擅长确定临时存储是否有意义,并对其进行优化。许多程序员陷入这样一种陷阱,即他们编写的 C 代码在存储使用和操作顺序方面很好地表示了机器将要执行的操作,但对于现代编译器而言,情况通常并非如此。
例如,您说这是您的 CPU 代码:
Ans [0] = (2.0/((20.5*(j[0]*j[0]))+(5.55*j[0])+20));
GPU 版本可以写成:
Ans [0] = cuCdiv(make_cuDoubleComplex(2.0, 0), cuCadd(cuCadd(cuCmul(cuCmul(j[tid], j[tid]), make_cuDoubleComplex(20.5, 0)), cuCmul(j[tid], make_cuDoubleComplex(5.55, 0))), make_cuDoubleComplex(20, 0)));
不使用显式临时存储。 (但是,代码肯定难以阅读。)但是在主机 (C) 或设备 (GPU) 情况下“幕后”发生的事情可能看起来不同。编译器通常比程序员更擅长计算如何优化这样的一行或几行代码。
首先让您的代码运行。然后对其进行基准测试(时间)。然后决定是否要仔细研究优化。 visual profiler 等工具可以帮助发现优化机会。
即使您的主机 C 代码看起来很简单,但请记住,复数仍然有 2 个与之关联的量。尽管这在(抽象的)C 代码中并不明显,但“在幕后”,编译器仍在执行必要的操作以分别处理数字以适合 +、-、*、/的各种操作
My question is, do all the additional lines of code mean longer processing time as it involves saving intermediate values in numerous temps.
不一定,因为我上面描述的原因。您对任一实现所做的工作基本相同,编译器将观察到这一点并可能生成类似的机器代码。
If so, would it still make sense to do this sort of calculation in the GPU when the number of elements are less than, say, 1000? (arbitrary number)
如果您像这样计算的答案总数约为 1000,那么对于现代 GPU 而言,您的问题“相当小”。现代 GPU 可能有 8 个(或更多)SM,每个 SM 能够同时运行 1 到 3 个 warp(32 个线程),并且机器还需要相当稳定的“准备运行”的 warp,以保持所有管道(内存、计算等)忙。 1000 个线程可能是实现 GPU 合理利用的最低限度。显然,这在很大程度上取决于您将在哪个或哪些 GPU 上运行。例如,笔记本电脑中的小型低端 GPU 可能能够以更小的问题实现高利用率。但是,如果您的计算范围是您在此处显示的类型的 1000,我也无法想象它会在 CPU(主机代码)上花费很多时间。
关于c++ - CUDA 中的复数/cuComplex 算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17532202/
#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
我是一名优秀的程序员,十分优秀!