CUDA,如何在CUDA内核中实现结构的动态数组
我正在尝试实现一个保存数据数组的结构 我想实现动态数组,比如:CUDA,如何在CUDA内核中实现结构的动态数组,cuda,Cuda,我正在尝试实现一个保存数据数组的结构 我想实现动态数组,比如: struct myStruct { float3 *data0, *data1; }; __global__ void kernel(myStruct input) { unsigned int N = 2; while(someStatements) { data0 = new float3[N]; // do somethings N *= 2; } } 如何在CUDA内核中执行类似操
struct myStruct {
float3 *data0, *data1;
};
__global__ void kernel(myStruct input) {
unsigned int N = 2;
while(someStatements) {
data0 = new float3[N];
// do somethings
N *= 2;
}
}
如何在CUDA内核中执行类似操作?如果您打算在compute capability 2.x或3,x设备上运行此代码,并且使用最新版本的CUDA,那么您的内核代码几乎是正确的。C++ +代码>新< /Calp>运算符支持CUDA 4。x和5在费米和开普勒硬件上。请注意,使用
new
或malloc
分配的内存是在设备的运行时堆上分配的。它具有创建它的上下文的生命周期,但您当前无法从CUDA主机API直接访问它(因此通过cudaMemcpy
或类似方式)
我将您的结构和内核转换为一个简单的示例代码,您可以自己尝试看看它是如何工作的:
#include <cstdio>
struct myStruct {
float *data;
};
__device__
void fill(float * x, unsigned int n)
{
for(int i=0; i<n; i++) x[i] = (float)i;
}
__global__
void kernel(myStruct *input, const unsigned int imax)
{
for(unsigned int i=0,N=1; i<imax; i++, N*=2) {
float * p = new float[N];
fill(p, N);
input[i].data = p;
}
}
__global__
void kernel2(myStruct *input, float *output, const unsigned int imax)
{
for(unsigned int i=0,N=1; i<imax; i++, N*=2) {
output[i] = input[i].data[N-1];
}
}
inline void gpuAssert(cudaError_t code, char * file, int line, bool Abort=true)
{
if (code != 0) {
fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code),file,line);
if (Abort) exit(code);
}
}
#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
int main(void)
{
const unsigned int nvals = 16;
struct myStruct * _s;
float * _f, * f;
gpuErrchk( cudaMalloc((void **)&_s, sizeof(struct myStruct) * size_t(nvals)) );
size_t sz = sizeof(float) * size_t(nvals);
gpuErrchk( cudaMalloc((void **)&_f, sz) );
f = new float[nvals];
kernel<<<1,1>>>(_s, nvals);
gpuErrchk( cudaPeekAtLastError() );
kernel2<<<1,1>>>(_s, _f, nvals);
gpuErrchk( cudaPeekAtLastError() );
gpuErrchk( cudaMemcpy(f, _f, sz, cudaMemcpyDeviceToHost) );
gpuErrchk( cudaDeviceReset() );
for(int i=0; i<nvals; i++) {
fprintf(stdout, "%d %f\n", i, f[i]);
}
return 0;
}
#包括
结构myStruct{
浮动*数据;
};
__设备
空白填充(浮点*x,无符号整数n)
{
对于(int i=0;i