2014-02-14 7 views
0

Ошибки я получаю являются:вызов от гр CUDA приводит к ошибкам

‘blockIdx’ was not declared in this scope expected primary-expression before ‘<’ token

expected primary-expression before ‘>’ token

expected primary-expression before ‘<’ token

expected primary-expression before ‘>’ token

("<,>" относится к вызову ядра < < < >>>)

Кроме того, в Основная функция я получаю:

error: cannot convert ‘float*’ to ‘float’ for argument ‘1’ to ‘void kernel_wrapper(float*, float*, int, int)

куб файла:

#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); 
... 

с файлом:

#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

Как заявляются А и В? А где код blockIdx? –

+0

Также: g ++ предназначен для компиляции C++-источников, является ли это C или C++? –

+0

@David Kernin: Я объявляю float * A = NULL; и тот же для B, а затем я выделяю выше (A = (float *) malloc (N * N * sizeof (float));). Файл имеет c, но я использую g ++, чтобы быть в порядке с файлом cu, который содержит iostream и т. д. .. – George

ответ

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); 

EDIT: Отвечая на вопрос ниже.

Проблема состоит в том, что указатели 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, и это не обязательно.

+0

: Когда я компиляция с g ++ -c -I .... myfile.cpp, он дает мне все ошибки, которые у меня есть в моем сообщении. – George

+0

Не ссылаться на stdC++ –

+0

Вы не можете скомпилировать код устройства cuda с g ++. –

Смежные вопросы