OpenCL内核使用率(操作与数据传输比率)

OpenCL内核使用率(操作与数据传输比率),opencl,Opencl,我打算实现一个OpenCL内核函数,根据该函数中要完成的计算(操作与数据传输的比率),我想确定是否值得继续这样做。因此,根据我的估计,我发现操作与数据传输的比率约为12-15,无论主机和设备之间要传输的数据输入/输出的维度如何,该比率都是恒定的 对于这种情况,您认为从主机还是从设备进行计算更好 谢谢没有更多细节,你只能疯狂地猜测。。。取决于你所说的“操作”(OpenCL级别?GPU指令级别?)“数据传输”(字节/字节),是否可以使用本地内存,主机到底是什么硬件,设备是什么硬件……没有更多细节,人

我打算实现一个OpenCL内核函数,根据该函数中要完成的计算(操作与数据传输的比率),我想确定是否值得继续这样做。因此,根据我的估计,我发现操作与数据传输的比率约为12-15,无论主机和设备之间要传输的数据输入/输出的维度如何,该比率都是恒定的

对于这种情况,您认为从主机还是从设备进行计算更好


谢谢

没有更多细节,你只能疯狂地猜测。。。取决于你所说的“操作”(OpenCL级别?GPU指令级别?)“数据传输”(字节/字节),是否可以使用本地内存,主机到底是什么硬件,设备是什么硬件……

没有更多细节,人们只能疯狂猜测。。。取决于您所说的“操作”(OpenCL级别?GPU指令级别?)“数据传输”(字节/字节),是否可以使用本地内存,主机到底是什么硬件,设备是什么硬件……

同意。此外,我们讨论的是什么数据类型?几乎所有的GPU都擅长32位浮点运算。当您进入不同大小的整数运算或16位(半)浮点时,它开始发散,对于双精度(64位)浮点值,它可能会有很大的不同。此外,某些类型的任务本质上比其他类型的任务更适合GPU风格的并行性。我使用基本上是浮点作为数据类型,操作基本上是和、除、乘、对数和atan公式。所以,我只需计算这些运算的数量,就可以知道运算与数据的比率transfer@Abdoulayendiongue事情并不是那么简单。我99%确定OpenCL的atan()目前没有在任何通用GPU(或CPU)上的硬件中实现,并且将使用十几条(或几十条)指令进行计算。log()存在于硬件中,至少在AMD上是这样,但它可能不是处处都兼容IEEE754,这意味着OpenCL也可以使用库实现。这意味着您的OpenCL程序将>=100条指令。因此,根据每个WItem从全局mem到全局mem的实际数据传输量,这可能值得在GPU上进行。顺便说一句,有一种方法可以通过在“native_”前面加上前缀来为某些操作使用本机硬件指令,但这同样取决于硬件,而且它的精度和域完全取决于硬件(通常非常糟糕)。顺便说一句,现代CPU没有atan()或log()或任何超越的指令,因此您的程序在CPU上的指令不会减少。谢谢@mogu。这意味着atan()和log()等函数需要如此多的基本运算,因此值得将其放在GPU上以并行方式执行。同意。此外,我们讨论的是什么数据类型?几乎所有GPU都擅长32位浮点运算。当您进入各种大小的整数运算或16位(一半)时,它开始发散浮动,并且对于双精度(64位)可能会有很大的不同浮点值。此外,某些类型的任务本质上比其他类型的任务更适合GPU风格的并行性。我基本上使用浮点作为数据类型,操作基本上是和、除、乘、对数和atan公式。因此,我只需计算这些操作的数量,就可以知道操作与数据传输的比率r@Abdoulayendiongue这并不是那么简单。我99%确定OpenCL的atan()目前没有在任何通用GPU(或CPU)上的硬件中实现,并且将使用十几条(或几十条)指令进行计算。log()存在于硬件中,至少在AMD上是这样,但它可能不是到处都兼容IEEE754,这意味着OpenCL也可以使用库实现。因此这意味着您的OpenCL程序将>=100条指令。因此,根据每个WItem从全局mem到全局mem的实际数据传输量,这可能值得在GPU上进行。顺便说一句,有在某些操作中使用本机硬件指令的一种方法,其前缀为“native_u”-但这同样取决于硬件,而且它的精度和域完全依赖于硬件(通常非常糟糕)。顺便说一句,现代CPU没有atan()或log()的指令或者任何超越性的东西,这样你的程序在CPU上的指令就不会减少。谢谢@mogu。这意味着像atan()和log()这样的函数需要很多基本操作,所以值得把它们放在GPU上,以便并行执行。