我收到的错误是:
'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+
答案 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);
A
和B
已经类型为float *
,所以我觉得你应该直接传递它们:
kernel_wrapper(A,B,Asize ,Bsize);
编辑:回答以下问题。
问题是指针A_host
和B_host
(kernel_wrapper
的参数)正在通过值传递给内核包装器函数和内核包装器函数是为那些指针分配存储空间,但是反映分配的存储的新修改的指针不能(不能)传递回调用函数(即调用kernel_wrapper
的函数)。
您可以在调用函数中为A_host
和B_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);
...
现在发布代码的方式,您正在为malloc
和A
执行两次B
操作,但这不是必需的。