gpt4 book ai didi

c++ - 通过单独的类将数组指针传输到 CUDA 内存中

转载 作者:行者123 更新时间:2023-11-28 05:05:17 25 4
gpt4 key购买 nike

我有一个名为“Coordinate”的类,它由一个 int 数组指针和一个 bool 变量组成。我想将这个指针发送到 CUDA,修改它然后在 CPU 内存中使用它。

这是 Coordinate.h :

#ifndef __COORDINATE_H
#define __COORDINATE_H

#include <stdlib.h>
#include <cuda.h>

using namespace std;

class Coordinate {

public:
int *array_pointer;
bool flag;

Coordinate() { flag = false; }

Coordinate(int array_length) {
flag = false;
array_pointer = new int[array_length];
for (int i = 0; i < array_length; i++) {
array_pointer[i] = -1;
}
}
};

#endif

我在 cudamain.cu Check1Check2 中制作了 2 个global 函数,它们都将坐标作为参数。 Check1 函数将仅更改 bool 标志,而 Check2 将更改 bool 标志并修改数组

这是 cudamain.cu :

#include <iostream>
#include <cuda.h>
#include "Coordinate.h"

using namespace std;

__global__ void check1(Coordinate *ptr) {
c->flag = true;
}

__global__ void check2(Coordinate *c) {
c->flag = true;
for (int i = 0; i < 10; i++) {
c->array_pointer[i] = i;
}
}


int main() {
Coordinate *d_a, *d_b, a, b;
a = Coordinate(10); b = Coordinate(10);

size_t size = sizeof(Coordinate);

cudaMalloc((void**)&d_a, size); cudaMalloc((void**)&d_b, size);
cudaMemcpy(d_a, &a, size, cudaMemcpyHostToDevice); cudaMemcpy(d_b, &b, size, cudaMemcpyHostToDevice);

check1 << <1, 1 >> > (d_a);
cudaMemcpy(&a, d_a, size, cudaMemcpyDeviceToHost);
cout <<"d_a result-> " <<a.flag <<" " <<a.array_pointer[9] << endl;

check2 << <1, 1 >> > (d_b);
cudaMemcpy(&b, d_b, size, cudaMemcpyDeviceToHost);
cout << "d_b result-> " << b.flag << " " << b.array_pointer[9] << endl;
return 0;
}

我制作了 2 个单独的坐标对象 aba 将与 check1 一起使用,b 将与 check2 一起使用ab 都以相同的方式初始化。

我得到的结果是

d_a result-> 1 -1
d_b result-> 0 -1

预期结果:

d_a result-> 1 -1
d_b result-> 1 9

不同的坐标对象可能有不同的数组长度,所以我无法在坐标类中初始化数组指针。

最佳答案

您不能通过取消引用从 CUDA 内核访问主机内存,除非那 block 内存是专门分配来允许这样做的,例如使用 cudaMallocManaged() .所以你的程序无法运行。阅读this Parallel4All post从主机和设备访问相同的内存。另一个alternative是@RobertCrovella 链接到的那个,涉及分配设备端内存。

但是,坦率地说,我怀疑在这种情况下您应该选择这两个选项中的任何一个,因为名为 Coordinate 的类似乎不需要可变大小数组的整数。你确定像

template <unsigned NumDimensions> 
class Coordinate<N> {
std::array<int, NumDimensions> a;
// etc. etc.
}

不会吗?

(请注意,std::array 类本身不能真正用于设备代码,就像大多数标准库一样。但是您可以轻松地 clone std::array 然后使用您的 cuda::array 类在主机端和设备端。)

即使出于某种原因需要动态分配内存,让一个看起来会被多次使用的类分配自己的内存也不是一个好主意。考虑使用一些预先分配的缓冲区,并让您的 Coordinate 将偏移量提前到其中(尽管这需要同步以确保线程安全,或者使缓冲区成为线程本地的)。

关于c++ - 通过单独的类将数组指针传输到 CUDA 内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44976663/

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