Глюк с картой:: вставьте (), то, что это не заменит значение, если ключ уже будет существовать в карте. Я видел код C++, записанный программистами Java, где они ожидали, вставляют () для поведения того же пути как Map.put () в Java, где значения заменяются.
На всякий случай вот мой вариант. Я использую его для компиляции проектов CUDA на Mac, но думаю, что он подойдет и для Linux. Для этого требуется CUDA SDK.
BINDIR = ./ # places compiled binary in current directory
EXECUTABLE := helloWorld
CCFILES := helloWorld.cpp
CUFILES := helloWorld.cu
# an ugly part - setting rootdir for CUDA SDK makefile
# look for common.mk - I don't know where SDK installs it on Linux -
# and change ROOTDIR accordingly
ROOTDIR := /Developer/GPU\ Computing/C/common
include $(ROOTDIR)/../common/common.mk
I've never heard of Cuda before, but from the online documentation it looks as if X.cu is supposed to be compiled into X.o, so having helloWorld.cu and helloWorld.cpp is not a good idea. With your permission I'll rename the "kernel" helloKernel.cu, then this should work:
NVCC = nvcc helloWorld.o: helloWorld.cpp helloWorld.h $(NVCC) -c %< -o $@ helloKernel.o: helloKernel.cu $(NVCC) -c %< -o $@ helloWorld: helloWorld.o helloKernel.o $(NVCC) %^ -o $@
(Note that those leading spaces are tabs.)
If that works, try a slicker version:
NVCC = nvcc helloWorld.o: %.o : %.cpp %.h helloKernel.o: %.o : %.cu %.o: $(NVCC) -c %< -o $@ helloWorld: helloWorld.o helloKernel.o $(NVCC) %^ -o $@
Моя версия, многословная, но прозрачная:
myapp: myapp.o g++ -fPIC -o $@ $< -L /usr/local/cuda/lib -lcudart myapp.o: myapp.cu /usr/local/cuda/bin/nvcc --compiler-options -fno-strict-aliasing \ -I/usr/local/cuda/include \ -DUNIX -O2 -o $@ -c $< matrixMul: matrixMul.o g++ -fPIC -o $@ $< -L /usr/local/cuda/lib -lcudart # It MUST be named .cu or nvcc compiles as regular C !!! (no __global__) matrixMul.o: matrixMul.cu /usr/local/cuda/bin/nvcc --compiler-options -fno-strict-aliasing \ -I/usr/local/cuda/include \ -DUNIX -O2 -o $@ -c $<