相关疑难解决方法(0)

数组结构与CUDA中的结构数组

从我在这里读到的一些评论中,出于某种原因,对于像CUDA这样的并行实现,最好有Structure of Arrays(SoA)over Array of Structures(AoS)吗?如果这是真的,谁能解释为什么?提前致谢!

c c++ arrays struct cuda

41
推荐指数
2
解决办法
3万
查看次数

如何使用CUDA执行struct的深度复制?

使用CUDA编程我在尝试将一些数据从主机复制到gpu时遇到了问题.

我有3个嵌套结构,如下所示:

typedef struct {
    char data[128];
    short length;
} Cell;

typedef struct {
    Cell* elements;
    int height;
    int width;
} Matrix;

typedef struct {
    Matrix* tables;
    int count;
} Container;
Run Code Online (Sandbox Code Playgroud)

所以Container"包括"一些Matrix元素,而这些Cell元素又包含一些元素.

假设我以这种方式动态分配主机内存:

Container c;
c.tables = malloc(20 * sizeof(Matrix));

for(int i = 0;i<20;i++){
    Matrix m;
    m.elements = malloc(100 * sizeof(Cell));
    c.tables[i] = m;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,每个100个单元的20个矩阵的容器.

  • 我现在如何使用cudaMemCpy()将此数据复制到设备内存?
  • 有没有什么好方法可以从主机到设备执行"struct of struct"的深层复制?

谢谢你的时间.

安德里亚

c c++ cuda deep-copy

7
推荐指数
1
解决办法
2326
查看次数

CUDA中结构的简单操作:分段故障

这是我第一次在CUDA中实现结构.在下面的程序中,我将结构复制到GPU并对数据执行基本操作,并将结果复制回主机.

#include<stdio.h>

inline cudaError_t checkCuda(cudaError_t result)
{
    #if defined(DEBUG) || defined(_DEBUG)
        if (result != cudaSuccess) {
            fprintf(stderr, "CUDA Runtime Error: %sn", cudaGetErrorString(result));
        assert(result == cudaSuccess);
        }
    #endif
    return result;
}

typedef struct myStruct {
    int* a;
    int b;
}MyStruct;

__global__ void structOperation(MyStruct *d_data){
    int idx = threadIdx.x;

    d_data->a[idx] += 10;
}

int main(){
    MyStruct *h_data, *d_data, *out_data;

    size_t structSize = sizeof(MyStruct);
    size_t intSize = sizeof(int);


    h_data = (MyStruct *) malloc(structSize * 1);
    h_data->b = 32;
    h_data->a = (int *)malloc(intSize * …
Run Code Online (Sandbox Code Playgroud)

cuda

2
推荐指数
1
解决办法
398
查看次数

使用 AoS 的内核比使用 SoA 更快

我有两个版本的内核执行相同的任务 - 填充链接单元列表 - 两个内核之间的区别是存储粒子位置的数据类型,第一个使用浮点数组来存储位置(每个粒子有 4 个浮点数)到 128 位读/写),第二个使用 vec3f 结构数组来存储位置(一个包含 3 个浮点数的结构)。

使用 nvprof 做一些测试,我发现第二个内核(使用 vec3f)比第一个运行得更快:

 Time(%)      Time   Calls       Avg       Min       Max  Name
   42.88    37.26s       2    18.63s   23.97us    37.26s  adentu_grid_cuda_filling_kernel(int*, int*, int*, float*, int, _vec3f, _vec3f, _vec3i)
   11.00     3.93s       2     1.97s   25.00us     3.93s  adentu_grid_cuda_filling_kernel(int*, int*, int*, _vec3f*, int, _vec3f, _vec3f, _vec3i)
Run Code Online (Sandbox Code Playgroud)

测试是尝试使用 256 和 512000 个粒子填充链接的单元格列表。

我的问题是,这里发生了什么?我认为 float 数组应该由于合并内存而进行更好的内存访问,而不是使用具有未对齐内存的 vec3f 结构数组。我误会了什么?

这些是内核,第一个内核:

__global__ void adentu_grid_cuda_filling_kernel (int *head,
                                                 int *linked,
                                                 int *cellnAtoms,
                                                 float *pos, 
                                                 int nAtoms, 
                                                 vec3f origin, 
                                                 vec3f h, …
Run Code Online (Sandbox Code Playgroud)

cuda

1
推荐指数
1
解决办法
776
查看次数

标签 统计

cuda ×4

c ×2

c++ ×2

arrays ×1

deep-copy ×1

struct ×1