0

ドライバー バージョン 5.0 の GPU デバイスで実行し、cuda 5.0 を使用しています。ドライバー API 関数を使用して vecAdd を完全に実行すると、エラーが発生します。私が取り組んでいるコードは以下に掲載されています。誰でもエラーの解決を手伝ってもらえますか?

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

#include "timer.h"

#include "vecAdd-kernel.ptx.h"
#include</opt/apps/cuda/5.0/include/cuda.h>
#include</opt/apps/cuda/5.0/include/cuda_runtime_api.h>

void compute_vec_add(int N, float *a, float* b, float *c);

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

   static CUcontext ctx;
  CUdevice dev;


  CUdeviceptr d_a, d_b, d_c;
  float *h_a, *h_b, *h_c, *h_temp;
  int i;
  int N = 1024 * 1024*8;

  struct stopwatch_t* timer = NULL;
  long double t_pcie_htd, t_pcie_dth, t_kernel, t_cpu;

  /* Setup timers */
  stopwatch_init ();
  timer = stopwatch_create ();

  /*
    Create the vectors
  */
  h_a = (float *) malloc(sizeof(float) * N);
  h_b = (float *) malloc(sizeof(float) * N);
  h_c = (float *) malloc(sizeof(float) * N);

  /*
    Set the initial values of h_a, h_b, and h_c
  */
  for (i=0; i < N; i++) {
    h_a[i] = (float) (rand() % 100) / 10.0;
    h_b[i] = (float) (rand() % 100) / 10.0;
    h_c[i] = (float) 0.0;
  }

  stopwatch_start (timer);
  CUmodule mod;
  CUfunction vecAddFunc;

     cuInit(0);

     cuDeviceGet(&dev, 0);
     cuCtxCreate(&ctx, 0, dev);

   cuModuleLoadData(&mod, (char *) imageBytes);
   cuModuleGetFunction(&vecAddFunc, mod, "vecAdd");

  size_t offset = 0;

   cuMemAlloc(&d_a,sizeof(float) * N); 
   cuMemAlloc(&d_b,sizeof(float) * N); 
   cuMemAlloc(&d_c,sizeof(float) * N); 

   cuMemcpyHtoD(d_a,h_a,sizeof(float) * N);
   cuMemcpyHtoD(d_b,h_b,sizeof(float) * N);
   cuMemcpyHtoD(d_c,h_c,sizeof(float) * N);

  cuParamSetv(vecAddFunc, offset, &d_a, sizeof(d_a));
  offset += sizeof(d_a);

  cuParamSetv(vecAddFunc, offset, &d_b, sizeof(d_b));
  offset += sizeof(d_b);

  cuParamSetv(vecAddFunc, offset, &d_c, sizeof(d_c));
  offset += sizeof(d_c);

  cuParamSetSize(vecAddFunc, offset);

  cuFuncSetBlockShape (vecAddFunc, 256, 1, 1);

  cuLaunchGrid(vecAddFunc, N/256, 1);
  cuStreamSynchronize(0);

  cuMemcpyDtoH(h_c,d_c,sizeof(float) * N);

  t_kernel = stopwatch_stop (timer);
  fprintf (stderr, "Time to execute GPU kernel: %Lg secs\n",t_kernel);


  /*
    Double check errors
  */
  h_temp = (float *) malloc(sizeof(float) * N);
  stopwatch_start (timer);
  compute_vec_add (N, h_a, h_b, h_temp);
  t_cpu = stopwatch_stop (timer);
  fprintf (stderr, "Time to execute CPU program: %Lg secs\n",
           t_cpu);

  int cnt = 0;
  for(int i = 0; i < N; i++) {
    if(abs(h_temp[i] - h_c[i]) > 1e-5) cnt++;
  }
  fprintf(stderr, "number of errors: %d out of %d\n", cnt, N);

  /*
    Free the host memory
  */
  free(h_a);
  free(h_b);
  free(h_c);


   cuMemFree(d_a);
   cuMemFree(d_b);
   cuMemFree(d_c);
   cuCtxDestroy(ctx);

  /*
    Free timer
  */
  stopwatch_destroy (timer);

  if(cnt == 0) {
    printf("\n\nSuccess\n");
  }
}

void
compute_vec_add(int N, float *a, float* b, float *c) {
  int i;
  for (i=0;i<N;i++)
    c[i]=a[i]+b[i];
}

エラーを見つけるためにcuda-gdbを使用したときの出力は次のとおりです。

タイマー: gettimeofday タイマーの解像度: ~ 1 us (?) [新しいスレッド 0x40200940 (LWP 32058)] [デバイス 0 でのコンテキスト 0x645a80 のコンテキスト作成] 警告: Cuda API エラーが検出されました: cuModuleLoadData が返されました (0xd1)

警告: Cuda API エラーが検出されました: cuModuleGetFunction が返されました (0x190)

警告: Cuda API エラーが検出されました: cuParamSetv が返されました (0x190)

警告: Cuda API エラーが検出されました: cuParamSetv が返されました (0x190)

警告: Cuda API エラーが検出されました: cuParamSetv が返されました (0x190)

警告: Cuda API エラーが検出されました: cuParamSetSize が返されました (0x190)

警告: Cuda API エラーが検出されました: cuFuncSetBlockShape が返されました (0x190)

プログラム受信信号 SIGSEGV、セグメンテーション違反。0x00002aaaaadab756 in ?? () /usr/lib64/libcuda.so.1 から

エラーに直面している理由を誰かが提案して、それを解決するのを手伝ってもらえますか?

私が使用しているカーネルコードは

/*
 * **CUDA KERNEL**
 *
 * Compute the sum of two vectors
 *   C[i] = A[i] + B[i]
 *
 */



extern "C" {


  __global__ void vecAdd(float* a, float* b, float* c)
  {
    /* Calculate index for this thread */
    int i = blockIdx.x * blockDim.x + threadIdx.x;

    /* Compute the element of C */
    c[i] = a[i] + b[i];
  }

}

私が使用しているコンパイルコマンドは

LDFLAGS = -I/usr/local/cuda/include \
          -L/usr/local/cuda/lib64 \


vecAdd-dummy: vecAdd-dummy.cu timer.o vecAdd-kernel.ptx.h
        nvcc -o vecAdd-dummy -arch=sm_20 vecAdd-dummy.cu timer.c ${LDFLAGS} -lcuda -g -G 

vecAdd-kernel.ptx : vecAdd-kernel.cu
        nvcc -arch=sm_20 -ptx $^ -o $@

vecAdd-kernel.ptx.h : vecAdd-kernel.ptx
        bin2c -t "char" $^ > $@

使用している GPU デバイスは Tesla M2090 です

4

1 に答える 1

2

Cuda API エラーが検出されました: cuModuleLoadData が返されました (0xd1)

/**
 * This indicates that there is no kernel image available that is suitable
 * for the device. This can occur when a user specifies code generation
 * options for a particular CUDA source file that do not include the
 * corresponding device configuration.
 */
CUDA_ERROR_NO_BINARY_FOR_GPU              = 209,

残りのエラーは、モジュールのロードに失敗した結果です。

関数 cuParamSet* および cuFuncSetBlockShaper は、CUDA 4.0 で廃止されました。モジュールのロードの問題を修正したら、関数 cuLaunchKernel を確認することをお勧めします。

于 2013-02-06T01:16:35.080 に答える