gpt4 book ai didi

cuda - 设备函数指针

转载 作者:行者123 更新时间:2023-12-04 01:45:13 24 4
gpt4 key购买 nike

我需要以下设备版本
主机代码:

double (**func)(double x);

double func1(double x)
{
return x+1.;
}

double func2(double x)
{
return x+2.;
}

double func3(double x)
{
return x+3.;
}

void test(void)
{
double x;

for(int i=0;i<3;++i){
x=func[i](2.0);
printf("%g\n",x);
}

}

int main(void)
{
func=(double (**)(double))malloc(10*sizeof(double (*)(double)));

test();

return 0;
}

其中 func1, func2, func3
必须是 __device__ 函数
和“测试”
必须是(适当修改的)__global__ 内核。

我有一个 NVIDIA GeForce GTS 450(计算能力 2.1)
提前谢谢你
米歇尔

================================================== ======

一个有效的解决方案
#define REAL double

typedef REAL (*func)(REAL x);

__host__ __device__ REAL func1(REAL x)
{
return x+1.0f;
}

__host__ __device__ REAL func2(REAL x)
{
return x+2.0f;
}

__host__ __device__ REAL func3(REAL x)
{
return x+3.0f;
}

__device__ func func_list_d[3];
func func_list_h[3];

__global__ void assign_kernel(void)
{
func_list_d[0]=func1;
func_list_d[1]=func2;
func_list_d[2]=func3;
}

void assign(void)
{
func_list_h[0]=func1;
func_list_h[1]=func2;
func_list_h[2]=func3;
}


__global__ void test_kernel(void)
{
REAL x;
for(int i=0;i<3;++i){
x=func_list_d[i](2.0);
printf("%g\n",x);
}
}

void test(void)
{
REAL x;
printf("=============\n");
for(int i=0;i<3;++i){
x=func_list_h[i](2.0);
printf("%g\n",x);
}
}

int main(void)
{
assign_kernel<<<1,1>>>();
test_kernel<<<1,1>>>();
cudaThreadSynchronize();

assign();
test();

return 0;
}

最佳答案

Fermi 上允许使用函数指针。
这是你可以做到的:

typedef double (*func)(double x);

__device__ double func1(double x)
{
return x+1.0f;
}

__device__ double func2(double x)
{
return x+2.0f;
}

__device__ double func3(double x)
{
return x+3.0f;
}

__device__ func pfunc1 = func1;
__device__ func pfunc2 = func2;
__device__ func pfunc3 = func3;

__global__ void test_kernel(func* f, int n)
{
double x;

for(int i=0;i<n;++i){
x=f[i](2.0);
printf("%g\n",x);
}
}

int main(void)
{
int N = 5;
func* h_f;
func* d_f;
h_f = (func*)malloc(N*sizeof(func));
cudaMalloc((void**)&d_f,N*sizeof(func));

cudaMemcpyFromSymbol( &h_f[0], pfunc1, sizeof(func));
cudaMemcpyFromSymbol( &h_f[1], pfunc1, sizeof(func));
cudaMemcpyFromSymbol( &h_f[2], pfunc2, sizeof(func));
cudaMemcpyFromSymbol( &h_f[3], pfunc3, sizeof(func));
cudaMemcpyFromSymbol( &h_f[4], pfunc3, sizeof(func));

cudaMemcpy(d_f,h_f,N*sizeof(func),cudaMemcpyHostToDevice);

test_kernel<<<1,1>>>(d_f,N);

cudaFree(d_f);
free(h_f);

return 0;
}

关于cuda - 设备函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com