gpt4 book ai didi

c++ - 来自包含相同头文件的其他 .cpp 文件的 CUDA 函数调用

转载 作者:行者123 更新时间:2023-11-28 00:26:48 25 4
gpt4 key购买 nike

我有两个文件 utilCUDA.cu 和 util.cpp。它们都包含 util.h。 “add”在 util.h 中声明并在 util.cpp 中定义。 “add”调用“addCUDA”来添加两个 vector 。请不要介意这种方法,它只是一个测试项目。

错误是:

util.cpp: In function ‘void add(double*, double*, double*, int)’:
util.cpp:5:20: error: ‘addCUDA’ was not declared in this scope

无论如何我可以在“添加”中调用“addCUDA”吗?

工具.h:

#ifndef __UTIL_H__
#define __UTIL_H__


#include <stdio.h>
void add(double *a, double *b, double *c, int size);
void printVec(double *v, int size);

#endif

实用程序.cpp:

#include "util.h"

void add(double *a, double *b, double * c, int N)
{
addCUDA(a,b,c,N);
}
void printVec(double *v, int size)
{
int i;
for(i = 0; i < size; i++)
printf("%f ", v[i]);
printf("\n");
}

utilCUDA.h:

#ifndef __UTILCUDA_H__
#define __UTILCUDA_H__
#include <cuda.h>
#include <cuda_runtime.h>
#include <cuda_runtime_api.h>
#include "util.h"

__global__ void myAdd(double *a, double *b, double *c, int size);
void addCUDA (double *a, double *b, double *c, int size);
#endif

utilCUDA.cu:

#include <stdio.h>
#include <stdlib.h>
#include "utilCUDA.h"
#define THREAD_PER_BLOCK 128
__global__ void myAdd( double *a, double *b, double *c, int size ) {
int tid = threadIdx.x + blockIdx.x * blockDim.x;//blockIdx.x; // this thread handles the data at its thread id
if (tid < size)
c[tid] = a[tid] + b[tid];
}

void addCUDA(double *a, double *b, double *c, int size)
{
printf("CUDA called\n");
double *dev_a, *dev_b, *dev_c;
cudaMalloc( (void**)&dev_a, size * sizeof(double) );
cudaMalloc( (void**)&dev_b, size * sizeof(double) );
cudaMalloc( (void**)&dev_c, size * sizeof(double) );

cudaMemcpy( dev_a, a, size * sizeof(double),
cudaMemcpyHostToDevice );
cudaMemcpy( dev_b, b, size * sizeof(double),
cudaMemcpyHostToDevice );
myAdd<<<(size - 1)/THREAD_PER_BLOCK + 1,THREAD_PER_BLOCK>>>( dev_a, dev_b, dev_c,size );

cudaMemcpy( c, dev_c, size * sizeof(double),
cudaMemcpyDeviceToHost );
cudaFree( dev_a );
cudaFree( dev_b );
cudaFree( dev_c );
}

测试.cpp:

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include "util.h"

#ifdef USE_CUDA
#include "utilCUDA.h"
#endif

using namespace std;

int main(int argc, char** argv)
{
int size = atoi(argv[1]);

double *a, *b, *c;// *cBase;
int j;
a = (double*)malloc(size*sizeof(double));
b = (double*)malloc(size*sizeof(double));
c = (double*)malloc(size*sizeof(double));

srand(time(NULL));
for(j = 0; j < size; j++)
{
a[j] = rand() % 10;
b[j] = rand() % 10;
}

printVec(a,size);
printVec(b,size);
#ifdef USE_CUDA
addCUDA(a,b,c,size);

#endif

#ifdef NO_CUDA
add(a,b,c,size);
#endif
printVec(c,size);
free(a);
free(b);
free(c);
return 0;
}

生成文件:

NVCC_RESULT := $(shell which nvcc 2> NULL)
NVCC_TEST := $(notdir $(NVCC_RESULT))
CFLAGS=-c -Wall

CUDAFLAGS=-c

CUDA_INCLUDE =
OBJ=test.o util.o
ifeq ($(NVCC_TEST),nvcc)
CUDACC := nvcc
CC := g++
OBJ+=utilCUDA.o
CUDA_INCLUDE += -I /usr/local/cuda-5.5/include
CCFLAGS := -DUSE_CUDA
else
CUDACC := g++
CC := g++
CCFLAGS := -DNO_CUDA

endif


all: test

test: $(OBJ)
$(CUDACC) $(CCFLAGS) $(OBJ) -o test

ifeq ($(NVCC_TEST),nvcc)
utilCUDA.o: utilCUDA.cu utilCUDA.h
$(CUDACC) $(CCFLAGS) $(CUDAFLAGS) utilCUDA.cu
endif

.cpp.o:
$(CC) $(CCFLAGS) $(CFLAGS) $*.cpp $(CUDA_INCLUDE)
clean:
rm -rf *.o test

最佳答案

util.cpp 调用 addCUDA 但您没有指出在哪里可以找到它。 (即您没有提供该范围内函数的“声明”。)

移动这一行:

void addCUDA (double *a, double *b, double *c, int size);

从 utilCUDA.h 到 util.h

这真的与 CUDA 无关。

关于c++ - 来自包含相同头文件的其他 .cpp 文件的 CUDA 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24639468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com