使用GPU添加数组元素的所有组合

时间:2015-12-09 10:03:18

标签: c# cuda parallel-processing gpu cudafy.net

我是CUDAfy编程的新手,无法计算数组中所有元素组合的总和。我似乎无法想到一个适合移植到GPU上的算法。 非常感谢任何帮助或任何类型的算法。

代码的串行版本如下:

 try{
// code
}
catch(Exception ex)
{
// Exception handling
}
finally{
        if(Input!=null){ 
         Input.close();
        }
}

1 个答案:

答案 0 :(得分:2)

除了单个添加之外,这并没有给GPU做很多工作。在您看到好处之前,阵列必须具有相当大的尺寸。无论如何:

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

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];
    }
}

您只是使用2D线程块来决定要添加的数组元素(它们只取代代码中的ij)。 arr的大小至少应为lendest的大小至少应为len*len。设置所有这些并运行它的主机代码将类似于:

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 );