我有两个cuda文件说A和B. 我需要调用一个从A到B的函数,如..
__device__ int add(int a, int b) //this is a function in A
{
return a+b;
}
__device__ void fun1(int a, int b) //this is a function in B
{
int c = A.add(a,b);
}
我该怎么做?
我可以使用static关键字吗?请举个例子..
答案 0 :(得分:4)
简短的回答是,你不能。 CUDA只支持内部链接,因此编译内核所需的一切都必须在同一个翻译单元中定义。
您可以做的是将函数放入如下的头文件中:
// Both functions in func.cuh
#pragma once
__device__ inline int add(int a, int b)
{
return a+b;
}
__device__ inline void fun1(int a, int b)
{
int c = add(a,b);
}
并将该头文件包含到您需要使用这些函数的每个.cu文件中。 CUDA构建的链似乎遵守inline
关键字,并且这种声明不会在我使用的任何CUDA平台上生成重复的符号(不包括Windows)。我不确定它是否打算工作,所以 cavaet emptor 。
答案 1 :(得分:1)
我认为同时有可能解决它: CUDA external class linkage and unresolved extern function in ptxas file
您可以在VS Project Properies中启用“生成可重定位设备代码” - > CUDA C / C ++ - > Common或使用编译器参数-rdc = true。