我有一个班级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.7
和fp_vec[1] = 0.9
。我想将这些排列应用于FPlan
类型的数组。
我错过了什么?是否在CUDA中调用了外部函数?
答案 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?