首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CUDA函数在DLL,__declspec(dllexport)工作,但奇怪的结果?

CUDA函数在DLL,__declspec(dllexport)工作,但奇怪的结果可能是由于以下几个原因导致的:

  1. 编译器选项不正确:在使用CUDA函数时,需要确保使用正确的编译器选项来编译代码,以确保CUDA代码能够正确地与其他代码进行链接。例如,需要使用nvcc编译器来编译包含CUDA函数的代码。
  2. CUDA运行时环境不匹配:CUDA函数需要与相应的CUDA运行时环境配合使用。如果CUDA函数在DLL中工作,但结果异常,可能是因为CUDA运行时环境与DLL中的CUDA函数不匹配。需要确保CUDA运行时环境与DLL中使用的CUDA版本一致。
  3. 内存管理问题:CUDA函数在DLL中工作时,可能会涉及到内存管理的问题。如果没有正确地分配和释放CUDA内存,可能会导致奇怪的结果。需要确保在调用CUDA函数之前正确地分配和释放CUDA内存。
  4. 并行计算问题:CUDA函数通常用于并行计算,如果在DLL中使用CUDA函数时没有正确地管理并行计算的相关参数,可能会导致奇怪的结果。需要确保在调用CUDA函数之前正确地设置并行计算的参数,如线程块大小、线程格大小等。
  5. 其他问题:除了上述可能的原因外,奇怪的结果还可能是由于其他因素引起的,如代码逻辑错误、数据类型不匹配、编译器优化问题等。需要仔细检查代码,确保没有其他潜在的问题。

总结起来,当CUDA函数在DLL中工作时出现奇怪的结果,需要检查编译器选项、CUDA运行时环境、内存管理、并行计算参数以及其他可能的问题,以找出导致异常结果的原因,并进行相应的修复。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

不能定义声明dllimport_不允许 dllimport 静态数据成员

为什么不能将这2个函数定义放在.cpp文件中上面已经有解释了。 上面说不太完美:添加以下说明: __declspec(dllexport) 声明一个导出函数,是说这个函数要从本DLL导出。...当然,如果你DLL里全是C++类的话,你无法DEF里指定导出函数,只能用__declspec(dllexport)导出类 __declspec(dllimport) 声明一个导入函数,是说这个函数是从别的...另外,DLL中使用DLL函数也可以这样做,从而提高空间和时间效率。 变量导入 与函数不同是,使用DLL变量时,需要显示地导入变量。...当然,如果你DLL里全是C++类的话,你无法DEF里指定导出函数,只能用__declspec(dllexport)导出 类。...但是,MSDN文档里面,对于__declspec(dllimport)说明让人感觉有点奇怪,先来看看MSDN里面是怎么说: 不使 用 __declspec(dllimport) 也能正确编译代码,使用

1.8K20

__declspec(dllexport)和__declspec(dllimport)

头文件中声明了方法,提供者那里方法应该被声明为__declspec(dllexport),使用者那里,方法应该被声明为__declspec(dllimport)。...__declspec(dllexport)声明一个导出函数,是说这个函数要从本DLL导出。...一般用于dll中省掉在DEF文件中手工定义导出哪些函数一个方法。当然,如果你DLL里全是C++类的话,你无法DEF里指定导出函数,只能用__declspec(dllexport)导出类。...__declspec(dllimport)声明一个导入函数,是说这个函数是从别的DLL导入。我要用。...一般用于使用某个dllexe中 不使用 __declspec(dllimport) 也能正确编译代码,使用 __declspec(dllimport) 使编译器可以生成更好代码。

1.8K70

LNK2019:win32下编写DLL,应用程序找不到DLL接口函数一种情况

set_global_run_config@gdface@@YAX_N0@Z),该符号函数 main 中被引用 令我感到奇怪是,动态库导出函数有好几个,只有这个函数报错,我打开生成动态库导入文件...通过字符串查找,的确找不到set_global_run_config函数。这证明是在编译生成动态库时候,就出了问题。 为什么偏偏只有这一个函数出问题呢?...我仔细比较这个函数和其他函数区别,发现那些能正常导出符号函数同一个cpp文件A中,只有这个问题函数另一个cpp文件B中。...__declspec(dllexport) #define DETECT_CL_EXTERN #else #define DETECT_CL_DLL_DECL __declspec(dllimport...结论就是: 对于动态库接口函数,在编译期间就与普通函数有区别,而不只是连接期间,所以函数所在cpp/c文件必须#include这个接口函数定义头文件。

63610

DLL之旅1 : 将程序打包成DLL

这也是很明显事情,每个mexw32文件都会共用一些函数,而这些函数编译成目标文件都会在mexw32中,这些拥有相同函数mexw32Simulink环境下可以单独运行,如果合在一起进行编译,...(dllexport)说明该函数为导出函数 /* 如果函数用"_stdcall"进行修饰,动态引用时候,要对"函数指针"也要进行"_stdcall"修饰 __stdcall:Windows API...默认函数调用协议 extern "C" _declspec(dllexport) double _stdcall qAdd(double a, double b); extern "C" _declspec...注意事项 主要就是集中头文件上: extern “C” 解决函数名由于不同编译器造成名字匹配问题 通常C++编译器编译时会对函数进行改名,而C编译器不会 _declspec(dllexport)说明该函数为导出函数...如果函数用_stdcall进行修饰,动态引用时候,要对函数指针也要进行_stdcall修饰 Next计划 [C-C++]DLL之旅2 : 调用DLL(静态&动态加载)

2K30

无法解析外部符号解决方法汇总

对于静态链接库来说,.lib文件包含了函数说明和定义;而对于动态链接库来说,.lib文件只有函数说明,运行时还需要.dll文件。那么如何使用.lib文件呢?...这个原因可能为:B既然是要生成dll共A使用,那么B中函数和类以及全局变量都要申明为__declspec(dllexport);而A中也需要申明这些函数(或类或全局变量)为__declspec(dllimport...__declspec(dllexport) #else #define DLL __declspec(dllimport) #endif class DLL TestB{ //.... }; 项目B...三、visual studio 诡异bug 没有使用其他lib库,只是一个.cpp文件使用另一个.cpp文件里定义函数结果一直报“无法解析外部符号错误”。...这时候,你可能觉得奇怪,明明需要使用B.lib,可是A工程项目配置里又没有引用。原因就在这。我也是被这个问题困扰了一下午,才终于搞明白。

14.2K10

VS2017生成DLL(C语言)文件并在C#中使用

第六步:c文件中输入一个简单函数这里使用了_declspec(dllexport),_declspec(dllexport)并不是必须,后面一种方法将不使用_declspec(dllexport...) _declspec(dllexport) int sum(int a, int b){ return a + b;} ?...第八步:头文件中输入函数声明 ? 这里也可以改成下面这样,extern "C" 如果是c语言调用并不需要,加这个是因为c++调用的话,指定c++调用方式和c语言一样. 加这个就是做兼容性....第十步:Debug文件夹下两个文件DLL.dllDLL.lib就是我们要使用两个文件了 ?...因为使用_declspec(dllexport),虽然这里我们只编译了一次,却生成了dll和lib两个文件 接下来C# 中使用:首先将上面生成dll放到C#目录下,一般是\bin\x86\Debug

2.1K10

编写dll时,为什么有 extern “C”

假设被调用DLL存在一个导出函数,原型如下: void printN(int); 三种方式从DLL导入导出函数 生成DLL时使用模块定义 (.def) 文件 主应用程序函数定义中使用关键字__declspec..._declspec(dllexport)和_declspec(dllimport)作用 _declspec还有另外用途,这里只讨论跟dll相关使用。正如括号里关键字一样,导出和导入。..._declspec(dllexport)用在dll上,用于说明这是导出函数。而_declspec(dllimport)用在调用dll程序中,用于说明这是从dll中导入函数。...因为dll中必须说明函数要用于导出,所以_declspec(dllexport)很有必要。但是可以换一种方式,可以使用def文件来说明哪些函数用于导出,同时def文件里边还有函数编号。...执行结果: 利用LoadLibrary动态加载dll方式 这种方式需要明确指定dll位置,而不是程序根据环境变量配置自己寻找(上面的方式中并没有指明dll位置,exe和dll同目录会自动搜索加载

2.3K10

exe调用DLL方式

假设被调用DLL存在一个导出函数,原型如下: void printN(int); 三种方式从DLL导入导出函数 生成DLL时使用模块定义 (.def) 文件 主应用程序函数定义中使用关键字__declspec..._declspec(dllexport)和_declspec(dllimport)作用 _declspec还有另外用途,这里只讨论跟dll相关使用。正如括号里关键字一样,导出和导入。..._declspec(dllexport)用在dll上,用于说明这是导出函数。而_declspec(dllimport)用在调用dll程序中,用于说明这是从dll中导入函数。...因为dll中必须说明函数要用于导出,所以_declspec(dllexport)很有必要。但是可以换一种方式,可以使用def文件来说明哪些函数用于导出,同时def文件里边还有函数编号。...执行结果: ?

2.5K10

NeilBlog

1.前言 我去年其实写过一篇关于dll博客,当时只是简单记录了过程,今年在给新员工出dll题目时,发现很多人对dll不太熟悉,所以想再写一篇博客,详细讲讲。 dll是什么呢?...2.VS下创建dll 通过创建项目,选择动态链接库,VS会默认给你生成一堆文件,其中有个文件叫做dllmain,函数里面是这样 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15...WINAPI,WINAPI也是宏,进去后发现是__stdcall 3.怎么写导出函数 正常来说,你是需要这样写 1 extern "C" __declspec(dllexport) void myfunc...至于__declspec(dllexport)你可以理解成个固定语法,这个你可以微软官网找到详细解释,我就不放了,简单理解就是,加了这个是让这个函数可以被导出,让外部来用它 上面说这个是一般写法,...) #endif 你一看,其实还是我上面说__declspec(dllexport) 一般你函数声明有__declspec(dllexport)时,函数实现便写不写都行了 这时候你就生成解决方案吧

7410

DLL之旅2 : 调用DLL(静态&动态加载)

头文件: qShareDll.h #ifndef _Q_SHARE_DLL_H #define _Q_SHARE_DLL_H extern "C" _declspec(dllexport) double..."C" 解决函数名由于不同编译器造成名字匹配问题 // 通常c++编译器编译时会对函数进行改名,而c编译器不会 // _declspec(dllexport)说明该函数为导出函数 /* 如果函数用..."_stdcall"进行修饰,动态引用时候,要对"函数指针"也要进行"_stdcall"修饰 __stdcall:Windows API默认函数调用协议 extern "C" _declspec(...dllexport) double _stdcall qAdd(double a, double b); extern "C" _declspec(dllexport) double _stdcall...,需要用Depend工具,查看函数名(这是不够),还需要知道函数是怎么声明(不然无法定义函数指针)。

2.2K10

Qt中纯C++项目发布为dll方法(超详细步骤)

创建好以后你会发现有一个包含global头文件,这个文件中定义了__declspec(dllexport)、__declspec(dllimport)等,也可以删掉(如果要按照下面的方法的话,删掉即可...按照导出dll操作划分,有两种模式: 导出普通方法(导出后可静态调用,也可动态调用) 首先是头文件内容: 头文件: 方法声明时,前面加上__declspec(dllimport),也可用#define...定义,看代码: //为了和将来用到程序中公用一个头文件,创建dll时用到是__declspec(dllexport),而使用dll时用到__declspec(dllimport),完全可以各自写一下...请注意看红色框中部分(不要管其他,我文件里面还有其他东西),这就是四个函数.dll文件中名称,我小小地猜测了一下,后面的v代表参数为void类型,i个数代表int类型参数个数,前面的字母就不太清楚了...,有知道欢迎交流哈) 对于类的话,创建时:class后面,类名前面加上定义__declspec(dllexport);使用时,换成__declspec(dllimport),也可以参照前面的#

1.3K20

extern C 关键字作用

C++中增加了函数重载操作,也就是可以源代码中编写同名函数,调用者根据填写实参不同,匹配不同函数实现执行对应操作,这个过程称作函数重载。...而普通执行文件好像是没有什么方法可以看到,至少目前我还不清楚,但是我们可以通过dll导出函数方式,来看看C++编译dll 和 C 编译出来dll 到底有什么差别。...查看dll导出函数工具:Dependency Walker #include // 使用 C 编译器编译后dll导出函数不会倾轧 _declspec(dllexport)...} #include // 使用 C++ 编译器编译后dll导出所有函数都会倾轧 _declspec(dllexport) int add(int a, int b) { return...#include // 使用 C++ 编译器编译后dll导出所有函数都会倾轧 // 增加 extern “C” 关键字 extern “C” { _declspec(dllexport

16220

VS2010上使用C#调用非托管C++生成DLL文件(图文讲解) 背景

背景      项目过程中,有时候你需要调用非C#编写DLL文件,尤其使用一些第三方通讯组件时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。...我们可以看到这里有一些文件,其中dllmain.cpp作为定义DLL应用程序入口点,它作用跟exe文件有个main或者WinMain入口函数是一样,它就是作为DLL一个入口函数,实际上它是个可选文件...} extern "C" __declspec(dllexport) int Sub(int x, int y) { return x - y; } extern "C" __declspec...而被extern "C"修饰变量和函数是按照C语言方式编译和连接。       __declspec(dllexport)目的是为了将对应函数放入到DLL动态库中。      ...extern "C" __declspec(dllexport)加起来目的是为了使用DllImport调用非托管C++DLL文件。因为使用DllImport只能调用由C语言函数做成DLL

2.7K50

c++DLL编程详解

非MFC动态库:不采用MFC类库结构,其导出函数为标准C接口,能被非MFC或MFC编写应用程序所调用; MFC规则DLL :包含一个继承自CWinApp类,其无消息循环 MFC扩展DLL:采用MFC...DLL中导出函数声明有两种方式: 一种函数声明中加上__declspec(dllexport; 另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序导出、属性及其他方面的信息...因此采用这种方式引用DLL全局变量时,千万不要进行这样赋值操作: dllGlobalVar = 1;其结果是dllGlobalVar指针内容发生变化,程序中以后再也引用不到DLL全局变量了。...类实现代码中定义了宏DLL_FILE,故DLL实现中所包含类声明实际上为: class _declspec(dllexport) point //导出类point { … } 和 class...) class_name //导入类 #endif 实际上,MFC DLL讲解中,您将看到比这更简便方法,而此处仅仅是为了说明_declspec(dllexport)与_declspec(dllimport

2.2K60

Dll 导出函数那些破事

Visual C++ 提供方便方法 01行int 前加入 __declspec(dllexport) 关键字 通过以上两种方法,我们就可以导出MyFunction函数。...Visual C++ 提供方便方法 01行int 前加入 __declspec(dllexport) 关键字 通过以上两种方法,我们就可以导出MyFunction函数。...如果利用不同编译器分别生成DLL和访问DLLexe程序,后者访问该DLL导出函数时就会出现问题。如上例中函数MyFunctionC++编译器改编后名字是?...第二种是定义导出函数时加上限定符:extern "C" 如:#define DLLEXPORT_API extern "C" _declspec(dllexport) extern "C"只解决了C和...#define DLLEXPORT_API extern "C" _declspec(dllexport) 01 DLLEXPORT_API int _stdcall MyFunction(int iVariant

2K30
领券