У меня есть структура, содержащая некоторые переменные и некоторые переменные указателя. Я хочу скопировать эту структуру с хоста на устройство в 2 разных функциях. В первой функции мне нужно скопировать всю структуру, кроме одной переменной указателя, а затем во второй функции мне нужно скопировать этот оставшийся указатель.
Я могу скопировать всю структуру, но не могу скопировать оставшуюся переменную указателя во второй функции.
#include<iostream>
#define cudaCheckErrors(msg) \
do { \
cudaError_t __err = cudaGetLastError(); \
if (__err != cudaSuccess) { \
fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
msg, cudaGetErrorString(__err), \
__FILE__, __LINE__); \
fprintf(stderr, "*** FAILED - ABORTING\n"); \
exit(1); \
} \
} while (0)
struct MultiSGDKernelParam {
int count;
size_t sizes;
float *weights;
float *mom;
float lrs;
};
__global__ void Launch(MultiSGDKernelParam *param, int N, MultiSGDKernelParam *result)
{
for(int i=0; i<N; i++)
{
result[i] =param[i];
}
}
MultiSGDKernelParam *fillStructure(float *temp, const int N)
{
MultiSGDKernelParam *param;
param = (MultiSGDKernelParam*) malloc( N * sizeof(MultiSGDKernelParam));
for( int i=0; i< N ; i++)
{
param[i].count = i;
param[i].sizes = i*2;
param[i].lrs = param[i].sizes - i;
param[i].weights = &temp[i];
}
std::cout<<"Inside the function"<<"\n";
for(int i=0; i< N; i++)
{
std::cout<<param[i].sizes<<" ,"<<param[i].lrs<<"\t";
}
std::cout<<std::endl;
for(int i =0 ; i<N;i++)
{
std::cout<<*(param[i].weights)<<"\t";
}
std::cout<<std::endl;
MultiSGDKernelParam *d_param;
cudaMalloc((void**)&d_param, N * sizeof(MultiSGDKernelParam));
cudaMemcpy(d_param,param,N * sizeof(MultiSGDKernelParam),cudaMemcpyHostToDevice);
return d_param;
}
MultiSGDKernelParam * fillFullStructure(float *tweight, float *tmom, const int N )
{
MultiSGDKernelParam *param = fillStructure( tweight, N );
/* float *d_mom;
cudaMalloc((void**)&d_mom,N*sizeof(float));
cudaCheckErrors("cudaMalloc1 fail");
cudaMemcpy(d_mom,tmom,N*sizeof(float), cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMemcpy1 fail");*/
for( int i=0; i< N ; i++)
{
cudaMemcpy(&(param[i].mom),&(tmom[i]),sizeof(float), cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMempcpy2 fail");
}
std::cout<<"Momentum Values copied"<<"\n";
/*cudaMemcpy(&(param->mom),tmom,N*sizeof(float), cudaMemcpyHostToDevice);
cudaCheckErrors("cudaMempcpy1fail");*/
return param;
}
int main()
{
static const int N =5;
float tempweight [N], tempmom[N] ;
for(int i=0; i< N; i++)
{
tempweight[i] = i*3 +1;
tempmom[i] = i+3;
}
MultiSGDKernelParam *result;
MultiSGDKernelParam *param = fillFullStructure( tempweight,tempmom, N );
const unsigned blocks = 1;
const unsigned threadsPerBlock = 4;
cudaMalloc(&result, N * sizeof(MultiSGDKernelParam));
Launch<<<blocks,threadsPerBlock>>>(param, N, result);
cudaDeviceSynchronize();
MultiSGDKernelParam *paramresult;
paramresult = (MultiSGDKernelParam*) malloc( N * sizeof(MultiSGDKernelParam));
cudaMemcpy(paramresult,result, N * sizeof(MultiSGDKernelParam),cudaMemcpyDeviceToHost);
std::cout<<"Inside Main"<<"\n";
for(int i=0; i< N; i++)
{
std::cout<<paramresult[i].sizes<<" ,"<<paramresult[i].lrs<<"\t";
}
std::cout<<std::endl;
for(int i =0 ; i<N;i++)
{
std::cout<<*(paramresult[i].weights)<<"\t";
std::cout<<*(paramresult[i].mom)<<"\t";
}
std::cout<<std::endl;
return 0;
}
Выходные данные выдаются как
Inside the function
0 ,0 2 ,1 4 ,2 6 ,3 8 ,4
1 4 7 10 13
Momentum Values copied
Inside Main
0 ,0 2 ,1 4 ,2 6 ,3 8 ,4
Segmentation fault (core dumped)
Iкод скомпилирован, но выдает ошибку сегментации при печати значений. Если копирование выполнено успешно Если нет, то в чем проблема.