Algorithm OpenCL中的整数组合

Algorithm OpenCL中的整数组合,algorithm,opencl,Algorithm,Opencl,我有一堆向量~500。我需要找到OpenCL中所有向量组合的三重乘积。C++中有很多R的东西,但是我还没有找到任何实现GPU的方法。我在Cuda中见过不少,但我只是想知道是否有任何可行的组合算法存在 我需要到处猜一猜来回答你的问题 我想你有一个n~500个向量的数组。这些向量都具有相同的维数m,可能m=3 你想要的是每3个向量vi,vj,vk的分量乘积,其中i,j,k在{0,…,n-1}中 简单的三维示例: result[idx].x = V[i].x * V[j].x * V[k].x; re

我有一堆向量~500。我需要找到OpenCL中所有向量组合的三重乘积。C++中有很多R的东西,但是我还没有找到任何实现GPU的方法。我在Cuda中见过不少,但我只是想知道是否有任何可行的组合算法存在

我需要到处猜一猜来回答你的问题

我想你有一个n~500个向量的数组。这些向量都具有相同的维数m,可能m=3

你想要的是每3个向量vi,vj,vk的分量乘积,其中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在CUDA的块和网格范围内

还有两件事:

也许你想要排列而不是组合。你可以跳过任意两个i,j,k相同的组合。但我还是建议保留它们,因为计算何时跳过可能比实际工作更昂贵。我还建议不要使用排列来为结果节省内存,因为这样可以节省不到1%的内存,并且使计算更加复杂。 你确定你有足够的内存来做这件事吗?存储结果需要n*n*n*m*sizeoffloat字节。如果n=500,m=3,那么已经是1.5GB了。这真的是你想要的吗?也许处理的下一步可以合并到计算中,这样就不需要存储中间结果。
谢谢你详细的回答。实际上,标量三重积计算三个向量a,b,c的a.bxc。但我知道你的总体想法。下一步是按降序对所有三重产品进行排序。所以我不确定我能不能缩短这一步。我应该能够使用向量集的子集约束到大约100-200个向量,以减少负担。
__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;
    ...
}