内核似乎没有执行

时间:2015-02-07 17:12:24

标签: cuda

我是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.我尝试从内核中打印并且它不会打印,所以我假设我没有执行。你能解释一下原因吗?

2 个答案:

答案 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
  • 的文件中
  • 我的CUDA SDK的路径是/opt/cuda(也许你有不同的路径)
  • 最重要的是:您的卡有哪些计算能力?我的GTX 580具有最高的计算能力2.0。所以我必须设置为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。

现在,重建的代码按预期工作。

我希望这很有用。