CUDA编译的一个奇怪问题

时间:2018-08-31 10:19:32

标签: cmake compilation cuda

该项目由CMake构建,并由Visual Studio 2015编译。 然后使用CUDA_ADD_LIBRARY命令将cuda代码编译成.lib文件。

代码如下:

//kernel.h
#pragma once
void run_kernel();

//kernel.cu
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime.h>
#include "device_launch_parameters.h"
#include<stdio.h>

__global__ void kernel1()
{
    printf("kernel1\n");
}
__global__ void kernel2()
{
    printf("kernel2\n");
}

void run_kernel()
{
    kernel1 <<<1, 1>>>();
    cudaDeviceSynchronize();
}

上面的代码应该在CMD窗口中输出字符串 kernel1 ,但是它会输出 kernel2

这个奇怪的问题仅在我当前的解决方案中发生,并且仅在发布模式下发生。 我尝试了许多事情,包括重建项目,删除Cmake缓存以及将cuda代码组织为解决方案的单独项目。但是它不断出现。

此外,我还进行了一些实验,发现问题可能在于无法区分函数的名称。只要它们的参数列表相同,以后定义的功能可能会覆盖那些首先定义的功能。

整个解决方案包含大量代码和依赖项,因此无法有效共享。抱歉,这个问题很难为您重现,但是我已经在这个问题上停留了几天。希望您能提供有关此问题的任何线索,对于在此问题下看到或撰写过的内容的所有人,我深表感谢。如果我有所进步,我也将其包含在问题中。

1 个答案:

答案 0 :(得分:0)

问题已解决。

事实证明,该项目使用编译器优化选项:/GL(Whole Program Optimization)和/ LTCG。 我删除了这些选项,一切都正确了。