Копировать массив структур с хоста на устройство, используя постоянную память

0

Я хочу скопировать значение 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++;
}
 }
  • 0
    Чтобы явно использовать постоянную память, размер постоянного символа должен быть указан во время компиляции. Следовательно, вы должны изменить __constant__ CCell* c_value; на что-то вроде __constant__ CCell c_value[N]; в которой N - ваш ожидаемый верхний предел занимаемого пространства символом. Ищите документы в интернете об использовании постоянной памяти в CUDA. Я могу сказать, если вы используете постоянную память для решения вышеуказанной проблемы, это повредит производительности.
  • 0
    спасибо за ваш ответ, но я попробовал это также, но это не работает
Показать ещё 6 комментариев
Теги:
cuda

1 ответ

1

Это работает #include "cuda_runtime.h" #include "device_launch_parameters.h" #include #include #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++;
    }

}
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню