使用常量内存将结构数组从主机复制到设备

时间:2013-12-06 02:59:27

标签: c++ c cuda

我想将int m_CellParticleNumber和m_aCellParticleID [CELLMAXPARTICLENUM]值从主机复制到设备。为此我使用常量内存。但我无法将值复制到常量内存。你可以帮我复制一下这个代码。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <stdio.h>
#include <memory>
#include<iostream>



#define m_CellNum 100
#define CELLMAXPARTICLENUM 100
int numPartilces = 10;

extern void Initialize();

struct CCell
{
    int m_CellParticleNumber ;
    int m_aCellParticleID[CELLMAXPARTICLENUM];
} ;
CCell* hvalue;
CCell* dvalue;
int* dCellParticleID;

__constant__ CCell* c_value;

__global__ void Sum_constant(CCell* value, int N)
{   
    int index;    
    index = blockIdx.x * blockDim.x + threadIdx.x;
    if (index<N)

        for(int idx=0;idx<N ;++idx)
            value[index].m_aCellParticleID[idx]= value[index].m_aCellParticleID[idx]+          c_value[index].m_aCellParticleID[idx] ;
    //return;

}


int main()
{

    hvalue = new CCell[m_CellNum];

    cudaMalloc((void**)&dvalue,m_CellNum * sizeof(CCell));
    //calling function to initialize the value
    Initialize();

    //initializing the device momory
    cudaMemcpy(dvalue, hvalue, sizeof(CCell)*m_CellNum,cudaMemcpyHostToDevice);
    //copying value to constant memory

    cudaMemcpyToSymbol(c_value->m_aCellParticleID, &dvalue->m_aCellParticleID,   sizeof(int)*m_CellNum);
    //dividing bolcks and grid
    int block_size = 4;
    int n_blocks = numPartilces/block_size + (numPartilces%block_size == 0 ? 0:1);
    //invocking kernel function
    Sum_constant <<< n_blocks, block_size >>> (c_value,numPartilces);
    //copying value from host to device
    cudaMemcpy(hvalue, dvalue,numPartilces * sizeof(int),cudaMemcpyDeviceToHost);
    //showing result
    for(int i = 0; i < 2; ++i)
    {
        for(int j = 0; j < numPartilces; ++j)
        {
            std::cout<<hvalue[i].m_aCellParticleID[j]<<"\n";
        }
    }


    free(hvalue);
    cudaFree(dvalue);
    return 0;
}
void Initialize()
{

    cudaMalloc((void**)&dCellParticleID,m_CellNum * sizeof(int));
    for(int i = 0; i < numPartilces; ++i)
    {

        hvalue[i].m_CellParticleNumber = 0;
        for(int j = 0; j < numPartilces; ++j)
        {
            hvalue[i].m_aCellParticleID[j] = j+2;
        }
        hvalue[i].m_CellParticleNumber++;
    }
}

这是我根据给出的建议尝试但仍然不起作用。你能帮我么。      #include“cuda_runtime.h”      #include“device_launch_parameters.h”

 #include <stdio.h>
 #include <memory>
 #include<iostream>



 #define m_CellNum 100
 #define CELLMAXPARTICLENUM 100
 int numPartilces = 10;

 extern void Initialize();

  struct CCell
 {
int m_CellParticleNumber ;
int m_aCellParticleID[CELLMAXPARTICLENUM];
  } ;
  CCell* hvalue;
  CCell* dvalue;
  int* dCellParticleID;

  __constant__ CCell c_value[m_CellNum];

   __global__ void Sum_constant(CCell* value, int N)
 {   
int index;    
  index = blockIdx.x * blockDim.x + threadIdx.x;
if (index<N)

for(int idx=0;idx<N ;++idx)
value[index].m_aCellParticleID[idx]= value[index].m_aCellParticleID[idx]+        c_value[index].m_aCellParticleID[idx] ;
//return;

 }


 int main()
 {
int numPartilces = 10;
hvalue = new CCell[m_CellNum];

cudaMalloc((void**)&dvalue,m_CellNum * sizeof(CCell));
//calling function to initialize the value
Initialize();

//initializing the device momory
cudaMemcpy(dvalue, hvalue, sizeof(CCell)*m_CellNum,cudaMemcpyHostToDevice);
//copying value to constant memory

  cudaMemcpyToSymbol(c_value, &dvalue, sizeof(dvalue));
//dividing bolcks and grid
int block_size = 4;
int n_blocks = numPartilces/block_size + (numPartilces%block_size == 0 ? 0:1);
//invocking kernel function
Sum_constant <<< n_blocks, block_size >>> (dvalue,numPartilces);
//copying value from host to device
cudaMemcpy(hvalue, dvalue,2*m_CellNum * sizeof(int),cudaMemcpyDeviceToHost);
//showing result
    for(int i = 0; i < numPartilces; ++i)
{
    for(int j = 0; j < numPartilces; ++j)
    {
        std::cout<<hvalue[i].m_aCellParticleID[j]<<"\n";
    }
}


free(hvalue);
cudaFree(dvalue);
  return 0;
 }
 void Initialize()
 {

cudaMalloc((void**)&dCellParticleID,m_CellNum * sizeof(int));
for(int i = 0; i < numPartilces; ++i)
{

    hvalue[i].m_CellParticleNumber = 0;
    for(int j = 0; j < numPartilces; ++j)
    {
        hvalue[i].m_aCellParticleID[j] = j+2;
    }
    hvalue[i].m_CellParticleNumber++;
}
 }

1 个答案:

答案 0 :(得分:1)

这很有效     #include“cuda_runtime.h”     #include“device_launch_parameters.h”     #包括     #包括     的#include

#define m_CellNum 100
#define CELLMAXPARTICLENUM 10
 int numPartilces = 10;
extern void Initialize();

__device__ struct CCell
{
int m_CellParticleNumber ;
int m_aCellParticleID[CELLMAXPARTICLENUM];
} ;
 CCell* hvalue;
 CCell* dvalue;
 int* dCellParticleID;

 __constant__ CCell * c_value;
// #define VALUE "c_value"
__global__ void Sum_constant(CCell* value, int N)
{   
int index;    
    index = blockIdx.x * blockDim.x + threadIdx.x;
if (index>=100)     
    return;
for(int idx=0;idx<10 ;++idx)
value[index].m_aCellParticleID[idx]= value[index].m_aCellParticleID[idx]+    c_value[index].m_aCellParticleID[idx] ;
//return;

}


int main()
{

int numPartilces = 10;
hvalue = new CCell[m_CellNum];
cudaMalloc((void**)&dvalue,m_CellNum * sizeof(CCell));
//calling function to initialize the value
Initialize();   
//initializing the device momory
cudaMemcpy(dvalue, hvalue, sizeof(CCell)*m_CellNum,cudaMemcpyHostToDevice);
//copying value to constant memory
cudaMemcpyToSymbol(c_value, &dvalue, sizeof(dvalue));
//dividing bolcks and grid
int block_size = 4;
int n_blocks = m_CellNum/block_size + (m_CellNum%block_size == 0 ? 0:1);
//invocking kernel function
Sum_constant <<< n_blocks, block_size >>> (dvalue,m_CellNum);
//copying value from host to device
cudaMemcpy(hvalue, dvalue,m_CellNum * sizeof(CCell),cudaMemcpyDeviceToHost);
//showing result
    for(int i = 0; i < 100; ++i)
{
    std::cout<< "i=" << i<<std::endl ;
    for(int j = 0; j <numPartilces ; ++j)
    {
        std::cout<<hvalue[i].m_aCellParticleID[j]<<"\n";

    }
    std::cout<<hvalue[i].m_CellParticleNumber<<"Particle Num"<<std::endl;
}
free(hvalue);
cudaFree(dvalue);
cudaFree(c_value);
  return 0;
}
void Initialize()
    {

for(int i = 0; i < m_CellNum; ++i)
{

    hvalue[i].m_CellParticleNumber = 0;
    for(int j = 0; j < numPartilces; ++j)
    {
        hvalue[i].m_aCellParticleID[j] = j+2;
        hvalue[i].m_CellParticleNumber++;
    }

}
}