4

以下は、基本的にCであるが、NVidiaCUDA関数を内部に持つCUDAプログラミングの例です。私はこのコード例を解釈して、それが何をしようとしているのかを理解しようとしています。私の質問は、これはプログラムがうまくコンパイルされるということですが、どのような議論が必要ですか?たとえば、このCUDAプログラムはLinuxエミュレーターで実行されていますが、。/ programを実行すると、次のように返されます。

使用法:./プログラム番号セグメンテーション違反

プログラムの入力引数は何ですか。ありがとうございました。

#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;
}
4

1 に答える 1

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

プログラムは、コマンドライン引数として単一の整数を取ります。./program 5(たとえば、と呼んでみてください。)

次に、SAXPY(初期のBLAS実装に由来する古い用語ですが、スタックしました。これは、次元のベクトルを使用して「単一(精度、別名フロート)実数アルファxプラスy」を意味します。)を計算しますN

于 2013-03-15T20:07:14.253 に答える