【发布时间】:2014-03-22 00:28:20
【问题描述】:
这是我在这里的第一篇文章 - 所以请耐心等待我。我目前正在尝试弄清楚如何编译一个包含普通 *.c 文件和一个 *.cu 文件的简单项目。显然,我想使用 nvcc 来做到这一点,我有两个“库”,它们基本上应该做同样的事情,但一个依赖于 OMP,另一个依赖于 CUDA。但是在浏览网页并通过 stackoverflow 爬行大约一天后,我完全被卡住了。这是我得到的:
我的来源/main.c:
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "../include/mylib_omp.h"
#include "../include/mylib_cuda.h"
int main(){
myfunc_CUDA(3.0,4);
return 0;
}
我的包含/mylib_omp.h:
#ifndef __MYLIB_OMP_H__
#define __MYLIB_OMP_H__
#include <omp.h>
void myfunc_OMP(float, int);
#endif
我的包含/mylib_cuda.h:
#ifndef __MYLIB_CUDA_H__
#define __MYLIB_CUDA_H__
#include <cuda_runtime_api.h>
#include <cuda.h>
void myfunc_CUDA(float, int);
#endif
我的来源/mylib_omp.c:
#ifndef __MYLIB_OMP_C__
#define __MYLIB_OMP_C__
#include "../include/mylib_omp.h"
void myfunc_OMP(float, int){
int i;
#pragma omp parallel
{
#pragma omp for
for (i = 0; i < 1000; i++){
int k = 0;
}
}
}
#endif
我的来源/mylib_cuda.cu
#ifndef __MYLIB_CUDA_CU__
#define __MYLIB_CUDA_CU__
extern "C"{
#include "../include/mylib_cuda.h"
}
extern "C"
void myfunc_CUDA(float a, int b){
float* i;
cudaMalloc((void **) &i,5*sizeof(float));
}
#endif
最后是我的 Makefile:
CC = nvcc
OUT = main
INCL_DIR = -I include
SOUR_DIR = sources
SOURCES = ${SOUR_DIR}/main.c \
${SOUR_DIR}/mylib_omp.c \
CUDA_SOURCES = ${SOUR_DIR}/mylib_cuda.cu
H_FILES = ${wildcard ${INCL_DIR}/*.h}
OBJECTS = ${SOURCES:.c=.o}
NVOBJECTS = ${CUDA_SOURCES:.cu=.o}
CFLAGS = -O3
NVCCFLAGS = -arch=sm_12 -ccbin=g++-4.4 -Xcompiler -openmp -x c++
LFLAGS = -lm -lcuda
INCLUDES = -I/opt/cuda/include
LIBS = -L/opt/cuda/lib64
${OUT}: ${OBJECTS} ${NVOBJECTS}
$(CC) $(INCL_DIR) $(INCLUDES) $(LIBS) $(CFLAGS) $(LFLAGS) -o $@ $^
$(SOUR_DIR)/%.o : $(SOUR_DIR)/%.cu $(H_FILES)
$(CC) $(NVCCFLAGS) $(INCL_DIR) $(INCLUDES) $(LIBS) -c -o $@ $<
$(SOUR_DIR)/%.o : $(SOUR_DIR)/%.c
$(CC) $(NVCCFLAGS) $(INCL_DIR) $(INCLUDES) $(LIBS) -c -o $@ $<
clean :
rm -f ${OBJECTS} ${NVOBJECTS} $(OUT)
很抱歉文件很多,但这基本上是尽可能短的。我昨天才弄清楚如何处理 makefile,因为我从未真正尝试过用任何语言处理更大的项目。所以现在解决问题。当我运行时,会发生以下情况:
[seb@seb-desktop make_cuda]$ make clean
rm -f sources/main.o sources/mylib_omp.o sources/mylib_cuda.o main
[seb@seb-desktop make_cuda]$ make
nvcc -arch=sm_12 -ccbin=g++-4.4 -Xcompiler -openmp -x c++ -I include -I/opt/cuda/include -L/opt/cuda/lib64 -c -o sources/main.o sources/main.c
nvcc -arch=sm_12 -ccbin=g++-4.4 -Xcompiler -openmp -x c++ -I include -I/opt/cuda/include -L/opt/cuda/lib64 -c -o sources/mylib_omp.o sources/mylib_omp.c
nvcc -arch=sm_12 -ccbin=g++-4.4 -Xcompiler -openmp -x c++ -I include -I/opt/cuda/include -L/opt/cuda/lib64 -c -o sources/mylib_cuda.o sources/mylib_cuda.cu
nvcc -I include -I/opt/cuda/include -L/opt/cuda/lib64 -O3 -lm -lcuda -o main sources/main.o sources/mylib_omp.o sources/mylib_cuda.o
sources/main.o: In function `main':
main.c:(.text+0x12): undefined reference to `myfunc_CUDA(float, int)'
collect2: Fehler: ld gab 1 als Ende-Status zurück
Makefile:27: recipe for target 'main' failed
make: *** [main] Error 1
任何帮助都会很高兴地得到一个拥抱和一张我第一次乘坐我的时间机器的门票!提前致谢!
【问题讨论】:
标签: c cuda makefile openmp nvcc