【发布时间】:2018-11-17 02:35:49
【问题描述】:
简介
我正在尝试编写一个将向量相互比较的程序。我需要它将每个向量与其他所有向量进行比较,并返回一个向量 c,其中 c[i] = a[i]/b[i]。所以我需要一个向量 C 用于集合中的每对向量。
代码 -- 简化
__global__
void compare_vectors(*a, *b, *c)
{ c[ i ] = a[ i ] / b[ i ] }
main()
for(... all vectors...)
compare_vectors <<< grid, block >>> (n, n+1, result)
问题
我的问题是这样做比在 CPU 上执行要慢。每次我遍历for循环时,都会将两个比较向量复制到设备内存,然后将结果向量复制回主机内存。
我希望能够将每个向量与其他每个向量进行比较,但要高效地进行,然后一次将所有结果复制回来。我该如何构造它,以便没有太多对 cudaMemcpy 的调用?
信息
我是 CUDA 的新手,所以如果这非常明显,请多多包涵。
我浏览了许多教程,并四处搜索。但是所有其他示例似乎都在比较两个非常长的向量,而不是许多较小的向量。我做了很多搜索和研究,但我找不到这样做的方法。
我有大约 2,000 个向量要比较。并且每个向量都与其他向量进行比较。所以 ~2,000 ^2 比较。每个向量的长度为 100 - 200 个浮点数。
谢谢@MartinBonner 和@platinum95。把它画在一个网格上真的让事情变得更清楚了。
【问题讨论】:
-
咳咳。
2000²比较,很多 - 但比2000!少很多(大约 10**13000)。 -
您的问题太小,无法在 GPU 上获利。不要浪费你的时间
-
它既不是阶乘也不是平方,它是一个组合问题,由 2000!/(2!(2000-2)!) 给出,即 1999000。另外,说计算 1999000 浮点数无利可图200 维向量的划分听起来不真实。
-
@platinum95。目前尚不清楚 OP 是否要将 a 与 b 以及 b 与 a 进行比较。我假设他是(并且忽略了 a 和 a 毫无意义的事实 - 这意味着它实际上是 2000² - 2000。)
-
操作。要查看它大致是正方形的,请绘制一个网格。用向量的名称标记每一行;用向量的名称标记每一列。网格上的每个点都是一个向量与一个向量(可能是同一个)的比较。网格上有 n² 个点。
标签: c++ optimization vector cuda