我想将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 :(得分: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++;
}
}
}