C/CUDA程序输出

4
以下是一个CUDA编程示例,它基本上是C语言,并带有NVidia CUDA函数。我一直在尝试解释这段代码示例并弄清楚它想要做什么。我的问题是,这个程序编译得很好,但它接受哪些参数?例如,在Linux模拟器中运行此CUDA程序时,运行./program后返回:
用法:./program number 分段错误
请问程序的输入参数是什么。谢谢。
#include <assert.h>
#include <stdio.h>

//#define N 100000

__host__ void saxpy_host(int length, float alpha, float * x, float * y)
{
    for (int i = 0; i < length; ++i)
    y[i] = alpha*x[i] + y[i];
}

__global__ void saxpy (int length, float alpha, float * x, float * y)
{
   int i;
   i = blockIdx.x*blockDim.x + threadIdx.x;
   if (i < length) y[i] = alpha*x[i]+y[i];
   __syncthreads();
}

int main(int argc, char* argv[]) {

if (argc != 2) { 
  printf("Usage: %s number\n", argv[0]);
  return -1;
}

int N = atoi(argv[1]);

// host data
float alpha = 0.5;
float x[N], xback[N];
float y[N], yback[N];

int size;
int i;
int blocks;

// determining size 
size = sizeof(float)*N;


// device data
float * dxp, * dyp;


// fill host data
for (i = 0; i < N; i++) {
   x[i] = (float) (rand () % 128);
   y[i] = (float) (rand () % 256);
}


// Allocating and Moving data to device
cudaMalloc((void**) &dxp, size);
cudaMalloc((void**) &dyp, size);
cudaMemcpy (dxp, x, size, cudaMemcpyHostToDevice);
cudaMemcpy (dyp, y, size, cudaMemcpyHostToDevice);

// size of thread blocks
blocks = (N + 31)/32;
saxpy <<< blocks, 32 >>> (N, alpha, dxp, dyp);

// bring back data
cudaMemcpy (xback, dxp, size, cudaMemcpyDeviceToHost); 
cudaMemcpy (yback, dyp, size, cudaMemcpyDeviceToHost);

// Calculating host SAXPY
saxpy_host (N, alpha, (float *) &x, (float *) &y);

// checking computation on host matches computation on GPU
for (i = 0; i < N; i++) {
  assert (yback[i] == y[i]) ;
  //printf ("%i %f %f \n", i, yback[i], y[i]);
}


// free device data
cudaFree(dxp); cudaFree(dyp);

return 0;
}
1个回答

3
int N = atoi(argv[1]);

该程序接受一个整数作为命令行参数。(例如尝试使用./program 5进行调用。)
然后它会计算具有维度N的向量的SAXPY(这是一个起源于早期BLAS实现的老术语,但仍在使用中。它的意思是“单精度(也称浮点)实数alpha乘以x加上y”)。

有没有想过 int 值会是多少。将值设为 100000 会返回错误:"int main(int, char**):Assertion 'yback[i] == y[i]' failed. Aborted",一个非常大的数字会导致错误 "Segmentation Fault"。 - Hopeless Programmer
它能运行小值 - 532 吗? - us2012
2
程序在我的真实GPU上运行良好,我尝试了5、100和1000个参数。因此,问题很可能出在你的模拟器上。请注意,如果程序计算成功并且没有输出任何内容,则表示它已经正常运行。如果我取消注释最后一个printf,那么GPU和CPU都会得到看起来合理的结果(显然是匹配的)。所以,你的模拟器很可能有问题。你报告的最后一个断言失败意味着计算产生了不正确的结果,与CPU端不匹配。再次强调——你的模拟器有问题。 - Robert Crovella
请问您能否上传输出数据?因为没有NVidia GPU,我不得不使用这个模拟器! - Hopeless Programmer
3
如果你将最后的assert注释掉并取消注释最后的printf,即使你的仿真器没有产生正确的结果,你也应该能够运行它,并看到在CPU和仿真器之间计算出的结果(它们不会匹配,可能)。这里是示例输出。 - Robert Crovella
如果您对us2012提供的答案感到满意,能否请您接受它?输入参数成为填充随机值并传递给saxpy操作的向量的长度 - 比较主机和设备计算。 - Robert Crovella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接