从c调用cuda会导致错误

时间:2014-02-14 15:26:50

标签: c cuda

我收到的错误是:

  

'blockIdx'未在此范围内声明   预期在'<'标记

之前的主要表达式      

在'>'标记

之前预期的主要表达式      

在'<'标记

之前预期的primary-expression      

在'>'标记

之前预期的主要表达式

(“<,>”指的是内核调用<<<>>>)

另外,在我收到的主要功能中:

  

错误:无法将参数'1'的'float * '转换为'float '为'void   kernel_wrapper(float *,float *,int,int)

cu文件:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <math.h>
#include <curand_kernel.h>
#include <cuda_runtime.h>
#include <cuda.h>

.....
__global__ void kernel(float* A,float *B, curandState* globalState, int Asize,int Bsize)
{
...

void kernel_wrapper(float* A_host,float* B_host, int Asize ,int Bsize)
{
...
//allocate host memory 
    A_host=(float*)malloc(Asize*sizeof(float));
    B_host=(float*)malloc(Bsize*sizeof(float));

    //allocate device memory
    float* A_dev,*B_dev;
    cudaMalloc((void**) &A_dev,Asize* sizeof(float));
    cudaMalloc((void**) &B_dev,Bsize* sizeof(float));
....

 kernel<<<1,1>>>(A_host,B_host, devStates,Asize,Bsize);
...

c file:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <string.h>
#include <assert.h>
#include <stdarg.h>
#include <cuda.h>
#include <cuda_runtime.h>
#include "solve.cu"


extern void kernel_wrapper(float* A,float* B, int Asize ,int Bsize);
...
int main()
{...
A = (float*)malloc(N*N*sizeof(float));
B = (float*)malloc(N*HS*sizeof(float));
...
kernel_wrapper(A,B,Asize ,Bsize);
...

我正在编译为:

 g++ -o mycode myfile.c -I/usr/local/cuda-5.5/include -L/usr/local/cuda-5.5/lib64 -lcurand -lcutil -lcudpp -lcuda -lstdc+

1 个答案:

答案 0 :(得分:3)

您不能在solve.cu文件中包含包含设备代码(例如内核)的.c,然后使用g++正确编译

设备代码必须由nvcc

编译

相反,您需要单独编译这两个文件,然后将它们链接在一起。

我建议您将myfile.c重命名为myfile.cpp

同样myfile.cpp

中删除这一行
#include "solve.cu"

然后编译:

nvcc -c solve.cu
g++ -c -I/usr/local/cuda-5.5/include  myfile.cpp 
g++ -o mycode solve.o myfile.o -L/usr/local/cuda-5.5/lib64 -lcudart -lcurand -lcutil -lcudpp -lcuda

对于上一期,你传递的是双指针(**):

kernel_wrapper(&A,&B,Asize ,Bsize);

原型期望单指针(*):

extern void kernel_wrapper(float* A,float* B, int Asize ,int Bsize);

AB 已经类型为float *,所以我觉得你应该直接传递它们:

kernel_wrapper(A,B,Asize ,Bsize);

编辑:回答以下问题。

问题是指针A_hostB_hostkernel_wrapper的参数)正在通过值传递给内核包装器函数和内核包装器函数是为那些指针分配存储空间,但是反映分配的存储的新修改的指针不能(不能)传递回调用函数(即调用kernel_wrapper的函数)。

您可以在调用函数中为A_hostB_host分配存储空间,然后传递指针(然后malloc中不需要kernel_wrapper这些指针或者你可以修改内核包装器,如下所示:

void kernel_wrapper(float** A_host,float** B_host, int Asize ,int Bsize)
{
...
//allocate host memory 
    *A_host=(float*)malloc(Asize*sizeof(float));
    *B_host=(float*)malloc(Bsize*sizeof(float));

    //allocate device memory
    float* A_dev,*B_dev;
    cudaMalloc((void**) &A_dev,Asize* sizeof(float));
    cudaMalloc((void**) &B_dev,Bsize* sizeof(float));
....
 cudaMemcpy(A_dev, *A_host, Asize*sizeof(float), cudaMemcpyHostToDevice);
 cudaMemcpy(B_dev, *B_host, Bsize*sizeof(float), cudaMemcpyHostToDevice);

 kernel<<<1,1>>>(A_dev,B_dev, devStates,Asize,Bsize);
...

然后您还需要修改.cpp文件中的调用行:

int main()
{...
  float *A, *B;
  int Asize = N*N;
  int Bsize = N*NHS;
...
  kernel_wrapper(&A,&B,Asize ,Bsize);
...

现在发布代码的方式,您正在为mallocA执行两次B操作,但这不是必需的。