我在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;
}
答案 0 :(得分:1)
您发布的代码中的一个问题是vec
是您在设备上取消引用的主机指针。这导致你的内核中止。
您必须以与处理vec
和res_h
的方式类似的方式处理res_d