簡體   English   中英

求向量的個數等於向量元素和不大於k的元素的和

[英]Find number of vectors with sum equal of vector elements and elements not bigger of k

我正在CUDA C中編寫一個程序,我已經用經典的方式解決了這個問題,但是我應該使用CUDA來並行化代碼。 問題是:打印所有長度為n的向量,其中每個元素的值可以為[0 ... K],並且所有元素的總和為SUM。

我已經用CUDA C編寫了程序,該程序應該向我返回滿足條件的向量的數量。 現在的問題是,我找不到代碼中的任何錯誤,我也不知道如何在Ubuntu中進行調試,並且輸出始終為0。我認為全局函數無法執行。 這是代碼,我希望有人能幫助我:

該程序的代碼是:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <cuda.h>

#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MYASSERT(condition) if(!(condition)) { return; }

__device__ void distribute2 (int vec[], int n, int k, int sum)
{
    int i;
    for (i =  blockIdx.x * blockDim.x + threadIdx.x;; i < n; i+=blockDim.x * gridDim.x)
    {
        vec[i]=MIN(sum, k);
        sum = sum- vec[i];
    }
    MYASSERT (sum == 0);
}
__global__ void moveUp (int vec[], int n, int k, int *res)
{
    int i;
    int collected = 0;
    for(i=blockIdx.x * blockDim.x + threadIdx.x; i<n;i+=blockDim.x * gridDim.x)
    {
        if (collected == 0)
            collected = vec[i];
        else
        {
            if (vec[i] < k)
            {
                vec[i] =vec[i]+1;
                distribute2 (vec, i, k, collected-1);
                __synchthreads();
                res[0]=res[0]+1;
            }
            else
            {
                collected += k;
            }
        }

    }
    MYASSERT(collected != 0);
}
int main()
{
    int n=5;
    int vec[n];
    int k=5;
    int sum=10;

    int *res_h, *res_d;
    size_t size = 1 * sizeof(int);
    res_h = (int *)malloc(size);
    cudaMalloc((void **) &res_d, size);
    res_h[0] = 0;
    cudaMemcpy(res_d, res_h, size, cudaMemcpyHostToDevice);

    cudaDeviceProp devProp;
    cudaGetDeviceProperties(&devProp, 0);
    unsigned maxbytes = devProp.totalGlobalMem / 3;
    unsigned max_samples = maxbytes / sizeof(int);

    if (n > max_samples) n = max_samples;

    printf("Using %d samples to estimate pi\n", n);

    moveUp<<<256, 256>>>(vec, n, k, res_d);
    cudaMemcpy(res_h, res_d, size, cudaMemcpyDeviceToHost);
    printf("%d\n", res_h[0]);
    return 0;
}

您發布的代碼中的一個問題是, vec是要在設備上取消引用的主機指針。 這導致您的內核中止。

您必須以與處理res_hres_d相似的方式處理vec

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM