CUDA/C - 在内核函数中使用 malloc 会产生奇怪的结果

2023-12-28

我是 CUDA/C 的新手,也是堆栈溢出的新手。这是我的第一个问题。

我试图在内核函数中动态分配内存,但结果出乎意料。 我读到在内核中使用 malloc() 会大大降低性能,但无论如何我都需要它,所以我首先尝试使用一个简单的int **array 只是为了测试可能性,那么我实际上需要分配更复杂的结构。

在我的主要我用过cudaMalloc()为数组分配空间int *,然后我用了malloc()对于内核函数中的每个线程,为外部数组的每个索引分配数组。然后我使用另一个线程来检查结果,但它并不总是有效。

这是主要代码:

#define N_CELLE 1024*2
#define L_CELLE 512

extern "C" {

int main(int argc, char **argv) {
  int *result = (int *)malloc(sizeof(int));
  int *d_result;
  int size_numbers = N_CELLE * sizeof(int *);
  int **d_numbers;

  cudaMalloc((void **)&d_numbers, size_numbers);
  cudaMalloc((void **)&d_result, sizeof(int *));

  kernel_one<<<2, 1024>>>(d_numbers);
  cudaDeviceSynchronize();
  kernel_two<<<1, 1>>>(d_numbers, d_result);

  cudaMemcpy(result, d_result, sizeof(int), cudaMemcpyDeviceToHost);

  printf("%d\n", *result);

  cudaFree(d_numbers);
  cudaFree(d_result);
  free(result);
}

}

I used extern "C"因为我在导入标头时无法编译,而本示例代码中未使用该标头。我粘贴它是因为我不知道这是否相关。

这是 kernel_one 代码:

__global__ void kernel_one(int **d_numbers) {
  int i = threadIdx.x + blockIdx.x * blockDim.x;
  d_numbers[i] = (int *)malloc(L_CELLE*sizeof(int));
  for(int j=0; j<L_CELLE;j++)
    d_numbers[i][j] = 1;
}

这是 kernel_two 代码:

__global__ void kernel_two(int **d_numbers, int *d_result) {
  int temp = 0;
  for(int i=0; i<N_CELLE; i++) {
    for(int j=0; j<L_CELLE;j++)
      temp += d_numbers[i][j];     
  }
  *d_result = temp;
}

一切工作正常(又名计数是正确的),直到我在设备内存中使用的总块数少于 1024*2*512。例如,如果我#define N_CELLE 1024*4程序开始给出“随机”结果,例如负数。 知道问题出在哪里吗? 谢谢任何人!


内核内存分配从静态分配的运行时堆中提取内存。在较大的大小下,您超出了该堆的大小,然后您的两个内核尝试从未初始化的内存中读取和写入。这会在设备上产生运行时错误并使结果无效。如果您在主机端添加了正确的 API 错误检查,或者使用以下命令运行代码,您就会知道这一点:cuda-memcheck公用事业。

解决方案是确保在尝试运行内核之前将堆大小设置为适当的值。添加这样的东西:

 size_t heapsize = sizeof(int) * size_t(N_CELLE) * size_t(2*L_CELLE);
 cudaDeviceSetLimit(cudaLimitMallocHeapSize, heapsize);

在任何其他 API 调用之前添加到您的主机代码应该可以解决问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA/C - 在内核函数中使用 malloc 会产生奇怪的结果 的相关文章

  • CUDA:获取数组中的最大值及其索引

    我有几个块 每个块在整数数组的单独部分上执行 举个例子 块一从 array 0 到 array 9 块二从 array 10 到 array 20 我可以获得每个块的数组最大值的索引的最佳方法是什么 示例块一 a 0 到 a 10 具有以下
  • 为什么 cuCtxCreate 返回旧上下文?

    我已经安装了 CUDA SDK 4 2 64 CUDA工具包4 2 64 CUDA 驱动程序 4 2 64 我检查了 windows 中的每个 nvcuda dll 所有这些都是 4 2 版本 但是当我使用驱动程序 api 创建上下文并使用
  • 由于从 UIImagePickerController 中的空闲列表中出队的指针签名无效,应用程序崩溃

    我面临的问题是UIImagePickerController选择 当我从照片库应用程序中选择来源时 由于以下原因而崩溃从空闲列表中出列的指针的签名无效 然后 如果我再次运行 它可以使用相同的代码正常工作 我在谷歌上搜索 发现一个与我的查询相
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • malloc :匿名映射和魔法区域

    我只是在摆弄内存映射 想查看用户空间虚拟内存区域映射 写了一些像这样的行 char ptr NULL printf Allocating 300KB n ptr malloc 300 1024 printf Allocated at p s
  • OpenCV 2.4.3rc 和 CUDA 4.2:“OpenCV 错误:没有 GPU 支持”

    我在这张专辑中上传了几张截图 https i stack imgur com TELST jpg https i stack imgur com TELST jpg 我正在尝试在 Visual Studio 2008 中的 OpenCV 中
  • 是否可以保证 WaveFront (OpenCL) 中的所有线程始终同步?

    众所周知 有WARP 在CUDA中 和WaveFront 在OpenCL中 http courses cs washington edu courses cse471 13sp lectures GPUsStudents pdf http
  • NVCC 警告级别

    我希望 NVCC 将以下警告视为错误 warning calling a host function foo from a host device function bar NVCC 文档 NVIDIA CUDA 编译器驱动程序 NVCC
  • 内存分配/释放瓶颈?

    在典型的实际程序中 内存分配 释放的瓶颈有多大 欢迎来自性能通常很重要的任何类型的程序的答案 malloc free 垃圾收集的正确实现是否足够快 以至于它只是少数极端情况下的瓶颈 或者大多数性能关键型软件会从尝试减少内存分配量或拥有更快的
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 将内核链接到 PTX 函数

    我可以使用 PTX 文件中包含的 PTX 函数作为外部设备函数 将其链接到另一个应调用该函数的 cu 文件吗 这是另一个问题CUDA 将内核链接在一起 https stackoverflow com questions 20636800 c
  • 我们如何在每次运行时使用不同的种子在 CUDA C 中生成随机数?

    我正在研究一个随机过程 我想在每次运行程序时在 CUDA 内核中生成不同的系列随机数 这类似于我们在 C 中声明 种子 时间 空 接下来是 srand 种子 和兰特 我可以通过内核将种子从主机传递到设备 但是 这样做的问题是我必须将整个种子
  • 布尔实现的atomicCAS

    我想弄清楚是否存在错误答案 https stackoverflow com a 57444538 11248508 现已删除 关于Cuda like的实现atomicCAS for bool是 答案中的代码 重新格式化 static inl
  • cudaMalloc使用向量>进行管理 > C++ - NVIDIA CUDA

    我正在通过 NVIDIA GeForce GT 650M GPU 为我创建的模拟实现多线程 为了确保一切正常工作 我创建了一些辅助代码来测试一切是否正常 在某一时刻 我需要更新变量向量 它们都可以单独更新 这是它的要点 device int
  • 一维纹理内存访问比一维全局内存访问更快吗?

    我正在测量标准纹理和 1Dtexture 内存访问之间的差异 为此 我创建了两个内核 global void texture1D float doarray int size int index calculate each thread
  • 如何从尖点库矩阵格式获取原始指针

    我需要从尖点库矩阵格式获取原始指针 例如 cusp coo matrix
  • 将 cuda 数组传递给 Thrust::inclusive_scan

    我可以对 cpu 上的数组使用包容性扫描 但是否可以对 gpu 上的数组执行此操作 注释是我知道有效但我不需要的方式 或者 是否有其他简单的方法可以对设备内存中的数组执行包含扫描 Code include
  • 将数据从 GPU 复制到 CPU - CUDA

    我在将数据从 GPU 复制到 CPU 时遇到问题 一开始我在 GPU 空间中创建变量 device float gpu array 在此 GPU 函数中 我想将数据从 od fS gi 值 0 43 复制到 gpu array global
  • 使用设备函数指针数组

    我需要以下设备版本 主机代码 double func double x double func1 double x return x 1 double func2 double x return x 2 double func3 doubl
  • 大小 8 2 的读/写无效

    在处理我的学校项目时 在 Unix 学校服务器上编译我的项目后 我不断收到来自 Valgrind 的以下错误 并且无法运行该程序 因为我收到 分段错误 11 95183 Memcheck a memory error detector 95

随机推荐

  • 在 Angular 5 上对 http 服务进行单元测试

    我对如何测试数据服务感到非常困惑 可能性太多 而且令人不知所措 我有这个简单的服务 Injectable export class DataService constructor private http HttpClient getDat
  • 量角器期望元素最终出现

    有没有办法期望元素最终出现在页面上 例如一种方式 browser wait protractor ExpectedConditions presenceOf element by partialLinkText Continue 1000
  • 使用 ResXResourceReader 时如何判断资源是嵌入文件还是嵌入字符串

    我有一个单独的应用程序 用于拼写检查我的 resx 文件 作为预构建事件运行 但是 如果 resx 文件包含文本文件 例如 xml 我的应用程序将加载该文件并尝试对其进行拼写检查 这并不是我真正想要它做的 有没有办法从 ResXResour
  • apt-get 错误:找不到“docker-ce”的版本“5:19.03.4~3-0~ubuntu-bionic”

    文档 https docs docker com install linux docker ce ubuntu 提供安装特定版本的语法docker ce sudo apt get install docker ce
  • 在 Linux 上为 Qt 应用程序获取 root 访问权限的正确方法

    Good day 背景 我正在为 Linux 系统创建一个 OpenVPN 包装应用程序 该应用程序已接近完成 我遇到了一个小障碍 OpenVPN 需要 root 访问权限才能修改路由表 添加和删除路由 这就是事情变得有点模糊和混乱的地方
  • Java语法解释-getMenuInflater()

    刚刚下载了 android studio 我正在使用大书呆子牧场 Android 编程指南来学习诀窍 当您启动 android studio 时 此代码已经在主活动文件中 Override public boolean onCreateOp
  • React 状态变量值显示为 null

    我正在尝试访问状态变量的值 但当我更改日期时它似乎为空 但如果我更改任何其他输入字段 我不会将其变为空 这里是link https stackblitz com edit react 6wbchf file src 2FApp js到 st
  • 如何在 J2ME 中分割字符串?

    如何在 J2ME 中有效地分割字符串 有一个StringTokenizer http download oracle com javase 1 4 2 docs api java util StringTokenizer html or S
  • 将 const char 转换为数组

    我正在尝试将 const char 转换为 char 这是我的代码 bool check const char word char temp 1 50 temp word return true 它是一个传入 const char 的函数
  • 为什么 ++i 不 || ++j && ++k 给出期望值

    我想知道为什么下面代码中k的值为1 I think i j k按照以下顺序执行 i j k 所以 在第一个片段中 i j i是真的 所以 j没有被评估 所以i 2 j 1 接下来 在第二个片段中 true k so k被评估 然后k 2 i
  • CUDA、cuPrintf 导致“未指定的启动失败”?

    我有一个内核 它以不同的网格大小运行两次 我的问题是 cuPrintf 当我没有的时候cudaPrintfInit 在内核运行之前和cudaPrintfDisplay stdout true and cudaPrintfEnd 内核运行后
  • RazorGenerator 无法看到自定义 cshtml 帮助程序

    我的 RazorGenerator 遇到问题 它无法编译使用我的自定义帮助程序的视图 App Code ViewHelper cshtml helper test System Web Mvc HtmlHelper html h4 Test
  • 单选按钮水平对齐

    如何使这两个单选按钮水平对齐 无论我如何尝试 它们都会保持垂直对齐或遍布各处 截至目前 它们是垂直对齐的 但我需要左侧的标签和右侧的转盘并靠近在一起 fieldset legend Payment Method legend div cla
  • Python Catboost:多类 F1 分数自定义指标

    如何找到多类 Catboost 分类器每个类的 F1 分数 我已经读过文档 https catboost ai docs concepts python reference catboostclassifier html和github 仓库
  • AngularJS 调用 REST 服务时回调如何工作?

    我正在学习 AngularJS 和 REST 代码示例使用这个词callback在认证功能中重复 回调 是 JavaScript 或 Angular 中的关键字吗 或者是callback只是在此代码中创建的自定义变量 如何callback在
  • 在 MVC2 中使用 FormsAuthenticationTicket cookie 自定义 IIdentity 和 IPrincipal

    我目前正在尝试在 ASP NET MVC2 Web 应用程序中实现一些自定义安全性 我正在尝试做一些非常简单的事情 如下面的代码所示 但由于某种原因 如果我使用 Authorize Roles Admins 我的控制器操作之一的属性 检查C
  • 同时构建许多类似的 Android .apk 文件?

    我有一个 Android 项目 我需要从中构建许多 apk apk 彼此之间仅在以下几个方面有所不同 Android 清单文件中有一些彼此不同的值 某些 apk 可能会排除 res 文件夹中的某些文件 不同的包名 自动构建所有这些不同的 a
  • 实体框架,代码优先。调用时子对象不会填充

    我首先要掌握 EF 代码 当我在代码中调用对象时 我的域模型设计似乎不支持自动 填充 对象的子对象 Model public class Car Key DatabaseGenerated DatabaseGeneratedOption I
  • 在 LINQ 中合并 2 个列表

    我有两个自定义对象列表 List1 Year Month ValueA List2 Year Month ValueB 我想要获得第三个列表 并将两者合并 List3 Year Month ValueA ValueB 在 LINQ VB N
  • CUDA/C - 在内核函数中使用 malloc 会产生奇怪的结果

    我是 CUDA C 的新手 也是堆栈溢出的新手 这是我的第一个问题 我试图在内核函数中动态分配内存 但结果出乎意料 我读到在内核中使用 malloc 会大大降低性能 但无论如何我都需要它 所以我首先尝试使用一个简单的int array 只是