内核似乎没有执行
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。
现在,重建的代码按预期工作。
希望有用。
我是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。
现在,重建的代码按预期工作。
希望有用。