gpt4 book ai didi

c++ - cudaMallocManaged with vector> C++ - NVIDIA CUDA

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

我正在通过 NVIDIA GeForce GT 650M GPU 为我创建的模拟实现多线程。为了确保一切正常,我创建了一些辅助代码来测试一切正常。有一次我需要更新一个变量 vector (它们都可以单独更新)。

这是它的要点:

`\__device__
int doComplexMath(float x, float y)
{
return x+y;
}`

`// Kernel function to add the elements of two arrays
__global__
void add(int n, float *x, float *y, vector<complex<long double> > *z)
{
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for (int i = index; i < n; i += stride)
z[i] = doComplexMath(*x, *y);
}`

`int main(void)
{
int iGAMAf = 1<<10;
float *x, *y;
vector<complex<long double> > VEL(iGAMAf,zero);
// Allocate Unified Memory – accessible from CPU or GPU
cudaMallocManaged(&x, sizeof(float));
cudaMallocManaged(&y, sizeof(float));
cudaMallocManaged(&VEL, iGAMAf*sizeof(vector<complex<long double> >));
// initialize x and y on the host
*x = 1.0f;
*y = 2.0f;
// Run kernel on 1M elements on the GPU
int blockSize = 256;
int numBlocks = (iGAMAf + blockSize - 1) / blockSize;
add<<<numBlocks, blockSize>>>(iGAMAf, x, y, *VEL);
// Wait for GPU to finish before accessing on host
cudaDeviceSynchronize();
return 0;
}`

我正在尝试分配统一内存(可从 GPU 和 CPU 访问的内存)。使用 nvcc 编译时,出现以下错误:

错误:重载函数“cudaMallocManaged”的实例不匹配参数列表 参数类型是:(std::__1::vector, std::__1::allocator>> *, unsigned long)

如何在 CUDA 中正确重载函数以将此类型用于多线程?

最佳答案

不可能做你想做的事。

要使用托管内存分配 vector ,您必须编写自己的分配器实现,该分配器继承自 std::allocator_traits并在后台调用 cudaMallocManaged。然后,您可以使用分配器类实例化一个 std::vector

另请注意,您的 CUDA 内核代码已损坏,因为您无法在设备代码中使用 std::vector

请注意,尽管该问题已考虑管理内存,但这适用于其他类型的 CUDA 分配,例如固定分配。

作为另一种选择,建议 here ,您可以考虑使用推力宿主 vector 代替 std::vector 并使用自定义分配器。一个可行的例子是 here在固定分配器的情况下 (cudaMallocHost/cudaHostAlloc)。

关于c++ - cudaMallocManaged with vector<complex<long double>> C++ - NVIDIA CUDA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51068485/

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