cmake - CUDA编译的一个奇怪问题
问题描述
该项目由 CMake 构建并由 Visual Studio 2015 编译。cuda 代码使用 CUDA_ADD_LIBRARY 命令编译成 .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 代码组织为解决方案的单独项目。但它不断出现。
另外,我也做了一些实验,发现问题可能是函数名无法区分。后面定义的函数可以覆盖首先定义的函数,只要它们的参数列表相同。
整个解决方案包含大量代码和依赖,无法有效共享。很抱歉这个问题很难为你重现,但我已经被这个问题困扰了好几天了。希望大家能给我一点关于这个问题的线索,也非常感谢在这个问题下看到或者写东西的大家。如果我进步一点,我也会把它包括在问题中。
解决方案
问题已解决。
事实证明,这个项目使用了编译器优化选项:/GL(Whole Program Optimization)和/LTCG。我删除了这些选项,一切都是正确的。
推荐阅读
- laravel-5 - 如何在 Laravel 中存储对象数据
- safari - 启用 Safari 应用扩展后打开新标签页
- java - 如何在 Java 中打印不同的参数多态方法?
- r - 在 R markdown Knitr HTML 输出中更改绘图大小以使所有内容可见时如何保持比率?
- google-analytics - 将增强的电子商务指标添加到查询中
- html - 如何将左侧的按钮与中心的链接对齐以形成可折叠的导航栏?
- r - 将存在-不存在矩阵转换为R中每行的单个变量
- google-maps - 我可以在带有选项滚轮的谷歌地图中使用滚动元素:真的吗?
- postgresql - 如何用包含相同选择语句的文件名替换 (select current_timestamp)?
- r - cronR cronjob 在 ubuntu/本地系统上工作,但不在 shinyapp.io 中