gpt4 book ai didi

c++ - 如何分配指针数组并为cuda中的多个内核调用保留它们

转载 作者:太空宇宙 更新时间:2023-11-04 03:54:25 24 4
gpt4 key购买 nike

我正在尝试在 cuda 中实现一个算法,我需要分配一个指向结构数组的指针数组。我的结构是,可以说:

    typedef struct {
float x, y;
} point;

我知道如果我想为多个内核调用保留数组,我必须从主机控制它们,对吗?指针的初始化必须在内核中完成。更具体地说,Array of Struct P 将包含随机顺序的笛卡尔点,而 dev_S_x 将是关于 中点的 x 坐标的排序版本P.

我试过:

__global__ void test( point *dev_P, point **dev_S_x) {
unsigned int tid = threadIdx.x + blockIdx.x * blockDim.x;

dev_P[tid].x = 3.141516;
dev_P[tid].y = 3.141516;
dev_S_x[tid] = &dev_P[tid];
...
}

和:

 int main( void ) {
point *P, *dev_P, **S_x, *dev_S_x;
P = (point*) malloc (N * sizeof (point) );
S_x = (point**) malloc (N * sizeof (point*));

// allocate the memory on the GPU
cudaMalloc( (void**) &dev_P, N * sizeof(point) );
cudaMalloc( (void***) &dev_S_x, N * sizeof(point*));

// copy the array P to the GPU
cudaMemcpy( dev_P, P, N * sizeof(point), cudaMemcpyHostToDevice);
cudaMemcpy( dev_S_x,S_x,N * sizeof(point*), cudaMemcpyHostToDevice);

test <<<1, 1 >>>( dev_P, &dev_S_x);
...
return 0;
}

这导致了很多

Test_project_cuda.exe 中 0x000007fefcc89e5d (KernelBase.dll) 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0020f920 处的 cudaError_enum..
检测到严重错误 c0000374

我是在指针数组的 cudamalloc 中做错了什么还是别的什么? (void***) 的用法是否正确?我想在内核中使用例如 dev_S_x[tid]->xdev_S_x[tid]->y 指向设备内存地址。那可行吗?提前致谢

最佳答案

dev_S_x 应声明为 point **并且应该作为一个值传递给内核(即 test <<<1, 1 >>>(dev_P, dev_S_x); )。

一方面,您所描述的内容听起来很适合 Thrust ,这将为您提供更简单的内存管理策略并访问快速排序例程。

关于c++ - 如何分配指针数组并为cuda中的多个内核调用保留它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17966533/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com