【发布时间】:2013-03-16 16:08:59
【问题描述】:
我试图在 CUDA 中做这样的事情(实际上我需要编写一些集成函数)
#include <iostream>
using namespace std;
float f1(float x) {
return x * x;
}
float f2(float x) {
return x;
}
void tabulate(float p_f(float)) {
for (int i = 0; i != 10; ++i) {
std::cout << p_f(i) << ' ';
}
std::cout << std::endl;
}
int main() {
tabulate(f1);
tabulate(f2);
return 0;
}
输出:
0 1 4 9 16 25 36 49 64 81
0 1 2 3 4 5 6 7 8 9
我尝试了以下但只得到错误
错误:sm_1x 不支持函数指针和函数模板参数。
float f1(float x) {
return x;
}
__global__ void tabulate(float lower, float upper, float p_function(float), float* result) {
for (lower; lower < upper; lower++) {
*result = *result + p_function(lower);
}
}
int main() {
float res;
float* dev_res;
cudaMalloc( (void**)&dev_res, sizeof(float) ) ;
tabulate<<<1,1>>>(0.0, 5.0, f1, dev_res);
cudaMemcpy(&res, dev_res, sizeof(float), cudaMemcpyDeviceToHost);
printf("%f\n", res);
/************************************************************************/
scanf("%s");
return 0;
}
【问题讨论】:
-
你用的是什么卡?您似乎将代码编译为计算能力 1.x,我认为函数指针是计算能力 2.x 的功能。您可以将您的 nvcc 调用更改为 -gencode arch=compute_20,code=sm_20(如果您的卡支持)
-
@alrikai GeForce 560Ti
-
那你应该把你的编译从 1.x 改成 2.x,这样就可以摆脱你的编译错误了。但是,您可能仍然会遇到一些运行时问题...
-
@alrikai 哦,好吧,但是有没有办法在 1.x 中制作这样的东西?
-
我不这么认为,看来您需要一个指向设备函数的函数指针,并且根据 CUDA 编程指南:“仅在编译的设备代码中支持指向设备函数的函数指针适用于计算能力 2.x 及更高版本的设备。”您的 560Ti 是计算能力 2.1,因此如果您更改为 -gencode arch=compute_20,code=sm_20 进行编译,它对您来说是可行的