内核似乎没有执行

Kernel seem not to execute

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

我检查了你的代码,一切正常。在我看来,您编译错误(假设您正确安装了 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(也许你有不同的路径)
  • 最重要的是:您的卡具有哪种计算能力?我的是具有最大计算能力 2.0 的 GTX 580。所以我必须设置一个NVCC标志arch=compute_20,code=sm_20,代表计算能力2.0

cuda_base.cu外还需要存储Makefile。我只是将您的代码复制并粘贴到此文件中,然后输入 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.

希望对您有所帮助 ;-)

我遇到了完全相同的问题。我试过来自 'CUDA by example'、Sanders & Kandrot 的矢量和示例。我输入代码,将向量加在一起,结果为零。

CUDA 不会将错误消息打印到控制台,并且只会 returns 来自 CUDAMalloc 和 CUDAMemcpy 等函数的错误代码。为了获得一个工作示例,我没有检查错误代码。一个基本的错误。所以,当我 运行 在 Visual Studio 中开始一个新的 CUDA 项目时加载的版本,并且确实进行了错误检查,宾果游戏!一个错误。错误消息是 'invalid device function'.

检查我的卡的计算能力,使用书中的程序或等效程序,表明它是...

...敬请期待...

1.1

所以,我更改了编译选项。在Visual Studio13中,项目->属性->配置属性->CUDAC/C++->设备->代码生成。

我将项目从 compute_20、sm_20 更改为 compute_11、sm_11。这表明计算能力是 1.1 而不是假定的 2.0。

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

希望有用。