推力与 cublas 的性能
performance of thrust vs. cublas
我有一个 std::vector
不同大小的矩阵,我要计算每个矩阵的平方。我有两个解决方案:
1/ 将我所有的矩阵展平,并将它们作为一个巨大的平面数组 (float *) 存储在设备中,其中包含该数组中每个矩阵的开始和结束索引,并使用 cublas 例如进行平方.
2/ 将矩阵存储在 thrust::device_vector<float *>
中并使用 thrust::for_each
对它们进行平方。
显然第二种解决方案提供了更具可读性的代码,但是它会影响性能吗?
我认为这(现在)只是 的重复。
假设您要执行的按元素运算是简单的操作,例如对每个元素求平方,那么这两种情况在性能或效率上应该没有什么区别。
这是因为此类操作将受内存限制,这意味着其性能将受到 (GPU) 内存带宽的限制。因此,这两种实现将具有大致相同的限制器和大致相同的性能。
请注意,在您的两个提案中,数据最终将需要以相同的方式有效地 "flattened"(不能以典型或简单的方式构造推力操作来对 thrust::device_vector<float *>
)
例如,如果您已经混合使用推力和 CUBLAS,那么您可能会使用适合您的方法。另一方面,如果您的模块仅使用 CUBLAS,并且您可以使用 CUBLAS 或 thrust 实现您的操作,我不确定我是否会仅为这一个操作注入推力。但这只是见仁见智。
我有一个 std::vector
不同大小的矩阵,我要计算每个矩阵的平方。我有两个解决方案:
1/ 将我所有的矩阵展平,并将它们作为一个巨大的平面数组 (float *) 存储在设备中,其中包含该数组中每个矩阵的开始和结束索引,并使用 cublas 例如进行平方.
2/ 将矩阵存储在 thrust::device_vector<float *>
中并使用 thrust::for_each
对它们进行平方。
显然第二种解决方案提供了更具可读性的代码,但是它会影响性能吗?
我认为这(现在)只是
假设您要执行的按元素运算是简单的操作,例如对每个元素求平方,那么这两种情况在性能或效率上应该没有什么区别。
这是因为此类操作将受内存限制,这意味着其性能将受到 (GPU) 内存带宽的限制。因此,这两种实现将具有大致相同的限制器和大致相同的性能。
请注意,在您的两个提案中,数据最终将需要以相同的方式有效地 "flattened"(不能以典型或简单的方式构造推力操作来对 thrust::device_vector<float *>
)
例如,如果您已经混合使用推力和 CUBLAS,那么您可能会使用适合您的方法。另一方面,如果您的模块仅使用 CUBLAS,并且您可以使用 CUBLAS 或 thrust 实现您的操作,我不确定我是否会仅为这一个操作注入推力。但这只是见仁见智。