我有一堆载体(~500)。我需要找到OpenCL中所有向量组合的三重产品。在C ++中有很多combination algorithms(n个n),但我还没有找到任何针对GPU的实现。我在Cuda看到了不少parallel permutation algorithms,但我只是想知道是否存在任何可行的组合算法?
答案 0 :(得分:0)
我需要在这里和那里猜测一下你的问题。
我想你有一个n(~500)向量的数组V.这些向量都具有相同的维数m(可能m = 3)。
你想要的是每3个向量v i ,v j ,v k 的组件明智乘积,其中i,j,k在{0,..,n-1}。
简单的三维示例:
result[idx].x = V[i].x * V[j].x * V[k].x;
result[idx].y = V[i].y * V[j].y * V[k].y;
result[idx].z = V[i].z * V[j].z * V[k].z;
现在也许你的矢量不是三维的,也许你不想要组件明智的产品,而是它的总和(如点积),但我相信你能够相应地调整代码。
这里真正的问题是如何计算所有可能的i,j,k和idx。正确的吗?
现在有了CUDA,你处于一个非常幸运的位置。您可以在网格中启动n * n * n个线程,因此可以免费获得i,j,k,而无需考虑计算组合或排列的方法。只需执行以下操作:
dim3 grid, block;
block.x = n;
block.y = 1;
block z = 1;
grid.x = n;
grid.y = n;
grid.z = 1;
compute_product_kernel<<<grid, block>>>( V, result );
这样你就可以启动n个n个n个线程的块。计算i,j,k变得微不足道,计算idx很容易:
__device__ void compute_product_kernel( myVector* V, myVector* result)
{
int i = blockIdx.x;
int j = blockIdx.y;
int k = threadIdx.x;
int idx = i * gridDim.y * blockDim.x + j * blockDim.x + k;
...
}
当然所有这一切都有效,因为你的n在CUDA的块和网格范围内。
但还有两件事:
result
节省内存,因为它可以节省1%的内存并使计算更加复杂。