【问题标题】:Kernel seem not to execute内核似乎没有执行
【发布时间】:2015-02-07 17:12:24
【问题描述】:

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

【问题讨论】:

  • proper cuda error checking 添加到您的代码中。您也可以尝试使用cuda-memcheck 运行您的代码。
  • 感谢您的提示。错误检查在第一个 cudaMalloc 上报告“未知错误”。 cuda-memcheck 检测到 0 个错误。
  • 您的机器配置有问题。 CUDA 在该机器上无法正常工作,因为它没有正确安装,或者因为其他一些机器问题。您可能需要仔细遵循 the getting started guide appropriate for your OS 中的说明,包括验证步骤。
  • 好的,这可能是一个原因,谢谢。

标签: cuda


【解决方案1】:

我检查了您的代码,一切正常。在我看来,您编译错误(假设您正确安装了 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 之外。我只是将您的代码复制并粘贴到此文件中,然后在 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.

希望这会有所帮助;-)

【讨论】:

  • 很高兴听到为什么人们不赞成我的回答。我真的专注于这个问题,检查了代码,在我的机器上执行它,发现在某些情况下为 nvcc 设置正确的标志是必不可少的。由于我使用的是 Linux,所以使用 Makefile 来编译它很方便。这是编写 CUDA 代码并在终端上编译的干净解决方案。
【解决方案2】:

我也遇到过同样的问题。我已经尝试过来自 Sanders & Kandrot 的“CUDA by example”中的向量和示例。我输入代码,将向量加在一起,结果为零。

CUDA 不会将错误消息打印到控制台,而只会从 CUDAMalloc 和 CUDAMemcpy 等函数返回错误代码。为了获得一个可行的示例,我没有检查错误代码。一个基本的错误。因此,当我运行在 Visual Studio 中启动新 CUDA 项目时加载的版本时,它确实会进行错误检查,宾果游戏!一个错误。错误消息是“无效的设备功能”。

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

...等一下...

1.1

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

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

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

希望对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多