C# 使用GPU添加所有阵列元素组合

C# 使用GPU添加所有阵列元素组合,c#,cuda,parallel-processing,gpu,cudafy.net,C#,Cuda,Parallel Processing,Gpu,Cudafy.net,我是CUDAfy编程新手,在计算数组中所有元素组合的总和时遇到困难。我似乎想不出一个足够适合移植到GPU上的算法。 非常感谢您的任何帮助或任何算法 代码的串行版本如下所示: for (int i = 0; i < Array.Count - 1; i++) { for (int j = (i + 1); j < Array.Count; j++) { ans.Add(Array.ElementAt(i) + Array.ElementAt(j));

我是CUDAfy编程新手,在计算数组中所有元素组合的总和时遇到困难。我似乎想不出一个足够适合移植到GPU上的算法。 非常感谢您的任何帮助或任何算法

代码的串行版本如下所示:

for (int i = 0; i < Array.Count - 1; i++)
{
    for (int j = (i + 1); j < Array.Count; j++)
    {
         ans.Add(Array.ElementAt(i) + Array.ElementAt(j));     

    }
}
for(int i=0;i
除了一次添加之外,这不会给GPU带来太多的工作。阵列的大小必须相当大,才能看到好处。无论如何:

我使用C++,对C语言或CUADAFY不熟悉,但是应该很容易移植逻辑。存储数组中每对元素之和的核函数为:

template<typename T>
__global__ void sum_combinations_of_array( const T* arr, const size_t len, T* dest )
{
    const int tx = blockIdx.x*blockDim.x+threadIdx.x;
    const int ty = blockIdx.y*blockDim.y+threadIdx.y;
    if( tx < len && ty < len && tx < ty ) {
        dest[tx*len+ty] = arr[tx]+arr[ty];
    }
}

事实上,我也有类似的问题。我也是新手。我相信,将数组的元素存储在两个不同的数组中是可能的,直接将这两个元素逐个添加可以得到所需的结果。但首先需要相当多的说明和比较才能获得这些数组,这可能不是最好的方法。希望这有助于。。。
const int len = 1000;

int* arr;
cudaMalloc( &arr, len*sizeof(int) );

int* matrix;
cudaMalloc( &matrix, len*len*sizeof(int) );
// cudaMalloc2D could also be used here, but then you'll
// have to pay attention to the pitch
cudaMemset( matrix, 0, len*len*sizeof(int) );

// copy host array to arr with cudaMemcpy
// ...

const int numThreads = ???; // depends on your hardware
dim3 grid( len, (len+numThreads-1)/numThreads ), threads( 1, numThreads );
sum_combinations_of_array<int><<<grid,threads>>>( arr, len, matrix );
cudaDeviceSynchronize(); // wait for completion

// copy device matrix to host with cudaMemcpy (or cudaMemcpy2D)
// remember any element i<=j will be 0
// ...

cudaFree( arr );
cudaFree( matrix );