请教:cuda的动态并行库,与c++ 的iomanip库,为什么在特殊情况下,存在冲突?

GKatHere GKatHere 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
游戏服务器开发面试精解 这是一份游戏服务器开发方向的面试题库,共 295 题,覆盖游戏服务端架构、网络通信、同步模型、场景管理、战斗系统、数据存储、分服容灾、反作弊运维等核心链路,交付三种阅读版本,方便随时翻看。 内容主线按面试实际被追问的路径组织,覆盖十二个模块:游戏服务器整体架构与进程模型、网络通信(TCP/KCP/UDP/协议设计)、同步模型(状态同步、帧同步、预测回滚)、场景管理与 AOI、战斗与技能系统、任务活动与商业化系统、数据库设计与数据落地、缓存与内存数据库(Redis)、分区分服跨服与合服、高并发容灾与回档、防作弊与外挂对抗、运维监控日志与线上事故处理。 游戏服务端和普通后端不同,考的不是 Redis 分布式锁这种背一遍就行的八股,而是 100 人同屏广播怎么压、帧同步不同步怎么查、回档事故怎么收场这类一线踩坑题。作者面过腾讯 IEG、网易雷火、米哈游等公司的服务端岗,按公开面经频次统计后重新出题并逐题写解答。每题先给一句能直接说出口的结论,再展开原理或排查步骤,最后列回答要点;带追问标记的题顺着项目场景往下挖。版本基准对齐 C++17、Linux epoll、MySQL 8.0 InnoDB、Redis 7.2、MongoDB 6.0、protobuf、KCP,Netty 与 Go 在对比题里提到。 适合准备校招或一到三年社招、目标腾讯、网易、米哈游、莉莉丝、三七等游戏服务端岗的同学,C++ 为主的服务器方向最对口,Go 或 Netty 栈的同学看网络和架构部分也通用。 使用时第一遍从头过,盖住答案自己说一遍,卡壳的标星;第二遍只看标星和高频题;面试前重点看同步、战斗、回档三个模块,追问别跳过。 立即下载
//    vs2022, c++20, cuda12.6, x64, DEBUG
//
//    请教下,为什么在自建lib项目中使用了<iomanip>,
//    而如果在cuda动态并行项目中,使用了此lib, 但不主动使用<iomanip>
//    那么,编译就会失败

//    一个简单自建lib
#include <iomanip>
void fnTestLib()    
{
	std::setiosflags(std::ios::showpoint);
}
//    一个简单的cuda项目
#include "D:/MyProjects/TestLib/TestLib.h"
#pragma comment(lib, "D:/MyProjects/TestLib/x64/Debug/TestLib.lib")	

__global__ void k3(){}
__global__ void k2(){   k3 << <1, 1 >> > ();}
__global__ void k1(){   k2 << <1, 1 >> > ();}

int main()
{
    fnTestLib();            //    调用lib函数
    k1 << <1, 1 >> > ();    //    cuda动态并行
    return 0;
}
//    编译cuda项目时,产生以下错误信息:
/*
1>libcpmt.lib(xthrow.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(kernel.cu.obj 中)
1>libcpmt.lib(xthrow.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MDd_DynamicDebug”(kernel.cu.obj 中)
1>libcpmt.lib(xmbtowc.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(kernel.cu.obj 中)
1>libcpmt.lib(xmbtowc.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MDd_DynamicDebug”(kernel.cu.obj 中)
1>libcpmt.lib(iomanip.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(kernel.cu.obj 中)
1>libcpmt.lib(iomanip.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MDd_DynamicDebug”(kernel.cu.obj 中)
1>  正在创建库 D:\MyProjects\TestCUDA\x64\Debug\TestCUDA.lib 和对象 D:\MyProjects\TestCUDA\x64\Debug\TestCUDA.exp
1>LINK : warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
*/

//    但是,如果不使用cuda动态并行,
//    则编译成功
__global__ void k3(){}
//__global__ void k2(){   k3 << <1, 1 >> > ();}
//__global__ void k1(){   k2 << <1, 1 >> > ();}

int main()
{
    fnTestLib();
    k3 << <1, 1 >> > ();
    return 0;
}

//    这还不是最奇怪的,奇怪的是,
//    如果在cuda项目中,添加一个cpp文件,主动使用一下<iomanip>
//    那么编译仍然会成功

//    cuda项目中的一个简单cpp:
#include <iomanip>
void cpptst()
{
	std::setiosflags(std::ios::showpoint);
}
//    cuda项目照样的动态并行
__global__ void k3(){}
__global__ void k2(){   k3 << <1, 1 >> > ();}
__global__ void k1(){   k2 << <1, 1 >> > ();}

int main()
{
    fnTestLib();
    k1 << <1, 1 >> > ();
    return 0;
}

 

...全文
评论
收藏 已收藏
分享
返回顶部
GKatHere
CUDA 591 成员 2,925 内容