我是CUDA编程的初学者,但这种情况看起来并不复杂,但却无法发挥作用。
#include <cuda.h>
#include <cuda_runtime.h>
#include <iostream>
__global__ void add(int *t)
{
t[2] = t[0] + t[1];
}
int main(int argc, char **argv)
{
int sum_cpu[3], *sum_gpu;
sum_cpu[0] = 1;
sum_cpu[1] = 2;
sum_cpu[2] = 0;
cudaMalloc((void**)&sum_gpu, 3 * sizeof(int));
cudaMemcpy(sum_gpu, sum_cpu, 3 * sizeof(int), cudaMemcpyHostToDevice);
add<<<1, 1>>>(sum_gpu);
cudaMemcpy(sum_cpu, sum_gpu, 3 * sizeof(int), cudaMemcpyDeviceToHost);
std::cout << sum_cpu[2];
cudaFree(sum_gpu);
return 0;
}
我正在编译它
nvcc main.cu
它编译,但返回值为0.我尝试从内核中打印并且它不会打印,所以我假设我没有执行。你能解释一下原因吗?
答案 0 :(得分:0)
我检查了你的代码,一切都很好。在我看来,你正在编译错误(假设你正确安装了CUDA SDK)。也许你错过了一些旗帜......我觉得这开始有点复杂。只需检查您的GPU具有哪种计算能力。
作为最佳实践,我为每个CUDA项目使用Makefile
。首次正确设置路径时,它非常易于使用。简化版本如下所示:
NAME=base
# Compilers
NVCC = nvcc
CC = gcc
LINK = nvcc
CUDA_INCLUDE=/opt/cuda
CUDA_LIBS= -lcuda -lcudart
SDK_INCLUDE=/opt/cuda/include
# Flags
COMMONFLAGS =-O2 -m64
NVCCFLAGS =-gencode arch=compute_20,code=sm_20 -m64 -O2
CXXFLAGS =
CFLAGS =
INCLUDES = -I$(CUDA_INCLUDE)
LIBS = $(CUDA_LIBS)
ALL_CCFLAGS :=
ALL_CCFLAGS += $(NVCCFLAGS)
ALL_CCFLAGS += $(addprefix -Xcompiler ,$(COMMONFLAGS))
OBJS = cuda_base.o
# Build rules
.DEFAULT: all
all: $(OBJS)
$(LINK) -o $(NAME) $(LIBS) $(OBJS)
%.o: %.cu
$(NVCC) -c $(ALL_CCFLAGS) $(INCLUDES) $<
%.o: %.c
$(NVCC) -ccbin $(CC) -c $(ALL_CCFLAGS) $(INCLUDES) $<
%.o: %.cpp
$(NVCC) -ccbin $(CXX) -c $(ALL_CCFLAGS) $(INCLUDES) $<
clean:
rm $(OBJS) $(NAME)
<强>解释强>
我正在使用Arch Linux x64
cuda_base.cu
/opt/cuda
(也许你有不同的路径)NVCC
标志arch=compute_20,code=sm_20
,代表计算能力2.0 Makefile需要存储在cuda_base.cu
之外。我只是复制&amp;将您的代码粘贴到此文件中,然后键入shell
$ make
nvcc -c -gencode arch=compute_20,code=sm_20 -m64 -O2 -Xcompiler -O2 -Xcompiler -m64 -I/opt/cuda cuda_base.cu
nvcc -o base -lcuda -lcudart cuda_base.o
$ ./base
3
并得到了你的结果。
我和我的一个朋友创建了一个用于编写CUDA代码的基本模板。 You can find it here if you like.
希望这会有所帮助; - )
答案 1 :(得分:-1)
我有完全相同的问题。我已经尝试过&#39; CUDA中的矢量和示例&#39;,Sanders&amp; Kandrot。我输入了代码,将矢量添加到一起,输出零。
CUDA不会向控制台输出错误消息,只返回CUDAMalloc和CUDAMemcpy等函数的错误代码。为了得到一个有效的例子,我没有检查错误代码。一个基本的错误。所以,当我在Visual Studio中启动一个新的CUDA项目时运行加载的版本,并且确实进行了错误检查,宾果!一个错误。错误消息是&#39;无效的设备功能&#39;。
使用书中的程序或同等程序检查我的卡的计算能力,表明它是......
......等等......
1.1
所以,我改变了编译选项。在Visual Studio 13中,项目 - &gt;属性 - &gt;配置属性 - &gt; CUDA C / C ++ - &gt;设备 - &gt;代码生成。
我将项目从compute_20,sm_20更改为compute_11,sm_11。这表明计算能力是1.1而不是假定的2.0。
现在,重建的代码按预期工作。
我希望这很有用。