我对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'的所有元素执行相同的计算,因此我可以并行处理此代码,并让每个线程/块负责每次计算(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编写代码

最佳答案



至少对于您显示的示例,这可能是不正确的。您似乎担心临时存储,但是编译器(主机和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代码并不明显,但“在幕后”编译器仍在进行必要的操作,以分别将数字视为+,-,*,/的各种操作。



不一定,由于上述原因。无论采用哪种实现方式,您所做的工作几乎都是相同的,编译器会观察到这一点,并且可能会生成类似的机器代码。



如果您要像这样计算的答案总数约为1000,那么对于现代GPU来说,您的问题“很小”。现代GPU可能具有8个(或更多)SM,每个SM能够同时运行1到3个经线(32个线程),并且计算机还需要相当稳定的“准备运行”经线以保持所有管线(内存) ,计算等)。 1000个线程可能是实现GPU合理利用的最低要求。显然,这很大程度上取决于您将在哪个GPU上运行。例如,笔记本电脑中的小型低端GPU可以实现更高的利用率,而问题甚至更小。但是,如果您的计算范围是此处显示的类型的1000,那么我也无法想象在CPU(主机代码)上花费的时间也很长。

关于c++ - CUDA中的复数/cuComplex算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17532202/

10-11 23:12
查看更多