内核中类方法的外部调用

时间:2015-02-12 12:04:50

标签: cuda

我有一个班级FPlan,它有许多方法,例如置换和打包。

__host__ __device__ void Perturb_action(FPlan *dfp){
  dfp->perturb();
  dfp->packing();
}

__global__ void Vector_Perturb(FPlan **dfp, int n){

int i=threadIx.x;
if(i<n) Perturb_action(dfp[i]);
}

in main:

FPlan **fp_vec;
fp_vec=(FPlan**)malloc(VEC_SIZE*sizeof(FPlan*));
//initialize the vec
for(int i=0; i<VEC_SIZE;i++)
 fp_vec[i]=&fp;
//fp of type FPlan that is initialized

int v_sz=sizeof(fp_vec);
double test=fp_vec[0]->getCost();
printf("the cost before perturb %f\n"test);
FPlan **value;
cudaMalloc(&value,v_sz);
cudaMemcpy(value,&fp_vec,v_sz,cudaMemcpyHostToDevice);

//call kernel
dim3 threadsPerBlock(VEC_SIZE);
dim3 numBlocks(1);
Vector_Perturb<<<numBlocks,threadsPerBlock>>> (value,VEC_SIZE);
cudaMemcpy(fp_vec,value,v_sz,cudaMemcpyDeviceToHost);
test=fp_vec[0]->getCost();
printf("the cost after perturb %f\n"test);
test=fp_vec[1]->getCost();
printf("the cost after perturb %f\n"test);

我在fp_vec[0] printf的置换之前获得成本0.8。 在fp_vec[0]置换值为inf后,对fp_vec[1]置换值为0.8。

排列后的预期输出应该类似于fp_vec[0] = 0.7fp_vec[1] = 0.9。我想将这些排列应用于FPlan类型的数组。

我错过了什么?是否在CUDA中调用了外部函数?

1 个答案:

答案 0 :(得分:1)

这似乎是一个常见的问题:

请考虑以下代码:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int* arr = (int*) malloc(100);
    printf("sizeof(arr) = %i", sizeof(arr));
    return 0;
}

预期的ouptut是什么? 100?没有它的4(至少在32位机器上)。 sizeof()返回变量类型的大小,而不是数组的分配大小。

int v_sz=sizeof(fp_vec);
double test=fp_vec[0]->getCost();
printf("the cost before perturb %f\n"test);
FPlan **value;
cudaMalloc(&value,v_sz);
cudaMemcpy(value,&fp_vec,v_sz,cudaMemcpyHostToDevice);

您在设备上分配4(或8)个字节并复制4(或8)个字节。结果是未定义的(也许每次都是垃圾)。

除此之外,您还要对CUDA调用进行适当的错误检查。 看看:What is the canonical way to check for errors using the CUDA runtime API?