cuda & rdc & 推入多个共享对象会在 registerEntryFunction 中产生 SIGSEV

2023-12-29

我正在尝试在两个共享库中运行可重定位设备代码,两者都使用 cuda-thrust。如果我停止在 kernel.cu 中使用推力,一切都会正常运行,这不是一个选项。

编辑:如果 rdc 被禁用,该程序也可以工作。对我来说也不是一个选择。

它编译得很好,但在运行时因段错误而停止。 gdb 告诉我这个:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000422cc8 in cudart::globalState::registerEntryFunction(void**, char const*, char*, char const*, int, uint3*, uint3*, dim3*, dim3*, int*) ()
(cuda-gdb) bt
#0  0x0000000000422cc8 in cudart::globalState::registerEntryFunction(void**, char const*, char*, char const*, int, uint3*, uint3*, dim3*, dim3*, int*) ()
#1  0x000000000040876c in __cudaRegisterFunction ()
#2  0x0000000000402b58 in __nv_cudaEntityRegisterCallback(void**) ()
#3  0x00007ffff75051a3 in __cudaRegisterLinkedBinary(__fatBinC_Wrapper_t const*, void (*)(void**), void*) ()
from /home/mindoms/rdctestmcsimple/libkernel.so
#4  0x00007ffff75050b1 in __cudaRegisterLinkedBinary_66_tmpxft_00007a5f_00000000_16_cuda_device_runtime_    compute_52_cpp1_ii_8b1a5d37 () from /home/user/rdctestmcsimple/libkernel.so
#5  0x000000000045285d in __libc_csu_init ()
#6  0x00007ffff65ea50f in __libc_start_main () from /lib64/libc.so.6

这是我的精简示例(使用 cmake)显示了错误。

主要.cpp:

#include "kernel.cuh"
#include "kernel2.cuh"

int main(){
  Kernel k;
  k.callKernel();

  Kernel2 k2;
  k2.callKernel2();
}

内核.cuh:

#ifndef __KERNEL_CUH__
#define __KERNEL_CUH__
  class Kernel{
  public:
    void callKernel();
  };
#endif

内核.cu:

#include "kernel.cuh"
#include <stdio.h>
#include <iostream>
#include <thrust/device_vector.h>

__global__
void thekernel(int *data){
  if (threadIdx.x == 0)
    printf("the kernel says hello\n");

  data[threadIdx.x] = threadIdx.x * 2;
}

void Kernel::callKernel(){

  thrust::device_vector<int> D2;
  D2.resize(11);
  int * raw_ptr = thrust::raw_pointer_cast(&D2[0]);

  printf("Kernel::callKernel called\n");
  thekernel <<< 1, 10 >>> (raw_ptr);

  cudaThreadSynchronize();
  cudaError_t code = cudaGetLastError();
  if (code != cudaSuccess) {
    std::cout << "Cuda error: " << cudaGetErrorString(code) << " after callKernel!" << std::endl;
  }

  for (int i = 0; i < D2.size(); i++)
  std::cout << "Kernel D[" << i << "]=" << D2[i] << std::endl;
}

内核2.cuh:

#ifndef __KERNEL2_CUH__
#define __KERNEL2_CUH__
  class Kernel2{
  public:
    void callKernel2();
  };
#endif

内核2.cu

#include "kernel2.cuh"
#include <stdio.h>
#include <iostream>
#include <thrust/device_vector.h>

__global__
void thekernel2(int *data2){
  if (threadIdx.x == 0)
    printf("the kernel2 says hello\n");

  data2[threadIdx.x] = threadIdx.x * 2;
}

void Kernel2::callKernel2(){
  thrust::device_vector<int> D;
  D.resize(11);
  int * raw_ptr = thrust::raw_pointer_cast(&D[0]);
  printf("Kernel2::callKernel2 called\n");
  thekernel2 <<< 1, 10 >>> (raw_ptr);

  cudaThreadSynchronize();
  cudaError_t code = cudaGetLastError();
  if (code != cudaSuccess) {
    std::cout << "Cuda error: " << cudaGetErrorString(code) << " after callKernel2!" << std::endl;
}

  for (int i = 0; i < D.size(); i++)
  std::cout << "Kernel2 D[" << i << "]=" << D[i] << std::endl;
}

最初使用了下面的 cmake 文件,但是当我“手动”编译时遇到了同样的问题:

nvcc -arch=sm_35 -Xcompiler -fPIC -dc kernel2.cu 
nvcc -arch=sm_35 -shared -Xcompiler -fPIC kernel2.o -o libkernel2.so
nvcc -arch=sm_35 -Xcompiler -fPIC -dc kernel.cu
nvcc -arch=sm_35 -shared -Xcompiler -fPIC kernel.o -o libkernel.so
g++ -o main main.cpp libkernel.so libkernel2.so -L/opt/cuda/current/lib64

Adding -cudart shared按照某处建议的每个 nvcc 调用都会导致不同的错误:

warning: Cuda API error detected: cudaFuncGetAttributes returned (0x8)

terminate called after throwing an instance of 'thrust::system::system_error'
  what():  function_attributes(): after cudaFuncGetAttributes: invalid device function

Program received signal SIGABRT, Aborted.
0x000000313c432625 in raise () from /lib64/libc.so.6
(cuda-gdb) bt
#0  0x000000313c432625 in raise () from /lib64/libc.so.6
#1  0x000000313c433e05 in abort () from /lib64/libc.so.6
#2  0x00000031430bea7d in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib64/libstdc++.so.6
#3  0x00000031430bcbd6 in std::set_unexpected(void (*)()) () from /usr/lib64/libstdc++.so.6
#4  0x00000031430bcc03 in std::terminate() () from /usr/lib64/libstdc++.so.6
#5  0x00000031430bcc86 in __cxa_rethrow () from /usr/lib64/libstdc++.so.6
#6  0x00007ffff7d600eb in thrust::detail::vector_base<int, thrust::device_malloc_allocator<int> >::append(unsigned long) () from ./libkernel.so
#7  0x00007ffff7d5f740 in thrust::detail::vector_base<int, thrust::device_malloc_allocator<int> >::resize(unsigned long) () from ./libkernel.so
#8  0x00007ffff7d5b19a in Kernel::callKernel() () from ./libkernel.so
#9  0x00000000004006f8 in main ()

CMakeLists.txt:请根据您的环境进行调整

cmake_minimum_required(VERSION 2.6.2)

project(Cuda-project)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMake/cuda" ${CMAKE_MODULE_PATH})

SET(CUDA_TOOLKIT_ROOT_DIR "/opt/cuda/current")

SET(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS}  -gencode arch=compute_52,code=sm_52)

find_package(CUDA REQUIRED)
link_directories(${CUDA_TOOLKIT_ROOT_DIR}/lib64)

set(CUDA_SEPARABLE_COMPILATION ON)

set(BUILD_SHARED_LIBS ON)

list(APPEND CUDA_NVCC_FLAGS -Xcompiler -fPIC)

CUDA_ADD_LIBRARY(kernel
  kernel.cu
  )

CUDA_ADD_LIBRARY(kernel2
  kernel2.cu
)

cuda_add_executable(rdctest main.cpp)
TARGET_LINK_LIBRARIES(rdctest kernel kernel2 cudadevrt)

关于我的系统:

Fedora 23 
kernel: 4.4.2-301.fc23.x86_64
Nvidia Driver: 361.28 
Nvidia Toolkit: 7.5.18
g++: g++ (GCC) 5.3.1 20151207 (Red Hat 5.3.1-2)

转载于:

CentOS release 6.7 (Final)
Kernel: 2.6.32-573.8.1.el6.x86_64
Nvidia Driver: 352.55
Nvidia Toolkit: 7.5.18
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)
glibc 2.12
cmake to 3.5

显然,这与 cuda 运行时的使用方式有关:共享或静态。

我稍微修改了您的示例:我创建了两个静态库,将它们链接到一个共享库,然后将其链接到可执行文件,而不是构建两个共享库并将它们单独链接到可执行文件。

另外,这里是一个更新的 CMake 文件,它使用新的 (>= 3.8) 本机 CUDA 语言支持。

cmake_minimum_required(VERSION 3.8)
project (CudaSharedThrust CXX CUDA)

string(APPEND CMAKE_CUDA_FLAGS " -gencode arch=compute_61,code=compute_61")

if(BUILD_SHARED_LIBS)
  set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()

add_library(kernel STATIC kernel.cu)
set_target_properties(kernel PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

add_library(kernel2 STATIC kernel2.cu)
set_target_properties(kernel2  PROPERTIES CUDA_SEPARABLE_COMPILATION ON)

add_library(allkernels empty.cu) # empty.cu is an empty file
set_target_properties(allkernels PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(allkernels kernel kernel2)


add_executable(rdctest main.cpp)
set_target_properties(rdctest PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(rdctest allkernels)

在没有任何 CMake 标志的情况下构建它(静态构建),构建成功并且程序可以运行。

建筑与-DBUILD_SHARED_LIBS=ON,程序可以编译,但会崩溃,并出现与您相同的错误。

建筑与

cmake .. -DBUILD_SHARED_LIBS=ON -DCMAKE_CUDA_FLAGS:STRING="--cudart shared"

编译并实际运行!因此,出于某种原因,此类事情需要共享 CUDA 运行时。

另请注意,从 2 个 SO -> 1 SO 中的 2 个静态库的步骤是必要的,因为否则程序将崩溃并出现hrust::system::system_error.

然而,这是预期的,因为 NVCC 实际上在设备链接期间忽略共享对象文件:http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#libraries http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#libraries

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

cuda & rdc & 推入多个共享对象会在 registerEntryFunction 中产生 SIGSEV 的相关文章

随机推荐

  • 绑定到 Twitter Bootstrap 3 中的 Collapse 事件

    假设我有 Bootstrap Collapse div class panel group div class panel panel default div class panel heading h4 class panel title
  • 错误:入口点不在当前项目内

    无法从 Android Studio 运行 flutter 未检测到 flutter 项目 其显示错误 入口点不在当前项目内 每次重新启动 android studio 时都会显示相同的错误消息 删除 ideaflutter 项目根目录下的
  • 使用 UIWebView 进行手势识别

    我在我正在构建的应用程序中设置了一些手势识别功能 其中一种手势是单指单击 它会隐藏屏幕顶部的工具栏 效果很好 除了一件事 点击链接也会导致工具栏消失 是否可以检测到不是链接点击的点击 我可以通过查看点击发生的位置来做到这一点 并且仅在 ht
  • 如何正确使用insertRowsAtIndexPaths?

    我浏览了在线的所有示例 但无法弄清楚如何正确地将单元格添加到带有动画的表格视图中 假设我有一个包含一个单元格的部分 当用户单击第一个单元格的附件时 我想添加另一个单元格 我的 添加 方法执行以下操作 IBAction toggleEnabl
  • Qt状态栏颜色

    我将 Qt 与 Python 结合使用 并且有一个底部带有状态栏的主窗口 我可以使用 QLabel 在栏中显示一条消息 并使用类似的方法设置该消息的颜色 font color In progress font 对于 QLabel 文本 我还
  • GO - 本地导入不起作用

    我是 golang 新手 我想构建我的第一个简单的 Web 应用程序 每次我想构建源代码时 都会收到错误locale import controllers in non local package 这是我的文件夹结构 goTest Dock
  • 在arm64上安装构建工具不起作用

    我一直在尝试安装sdkmanager build tools 30 0 2 在arm64处理器 安培CPU 上 但每次我得到这个 Warning Dependant package with key emulator not found W
  • 如何通过 apache 渲染 .phtml 文件

    我想通过 Apache 渲染 phtml 文件 但是当我尝试时 它会将页面渲染为文本而不是 html 在我的虚拟主机配置中 如果我尝试渲染index php 它会正确执行 但是 当我将 DirectoryIndex 更改为 index ph
  • 如何通过asp.net mvc中的api调用将文件上传到服务器上

    public ActionResult Index PublishPost post HttpPostedFileBase file var apiURL http test sa com rest social update 1161 u
  • 内核清零内存?

    我正在使用 Debian squeeze 并注意到内存总是归零 这是 Linux 发行版中的新功能吗 前段时间 我相信我可以使用 put 并且会输出垃圾 我多次运行这个测试程序 但注释的结果总是相同的 我在 sysctl conf 中有 r
  • 如何根据谷歌地图中标记的相对位置制作多边形?

    我有一个标记列表 我想在其周围创建一个多边形 显示标记周围的区域 而不是标记本身 因此 我希望多边形 包裹 在标记周围以显示它们周围的相对区域 而不是让多边形点成为标记的直接纬度 经度 关于我如何完成这样的事情有什么想法吗 这被称为凸包 有
  • 需要对开发者控制台上的 beta/alpha 测试进行一些说明

    背景 Android 开发者控制台有 3 个选项卡用于发布应用程序的 apk 文件 alpha beta 和 production 如下所示 我记得在一次 Google IO 讲座中 在进行 100 规模发布之前检查应用程序的好坏的一个很酷
  • 单击网格中的 LinkBut​​ton 时避免页面刷新

    我有一个GridView控件 并且在该控件内部我使用定义了一个链接按钮GridView ItemTemplate 我用它来点击打开一个新窗口 但是 当我单击链接按钮时 页面会在打开新窗口之前刷新 单击链接按钮后如何阻止页面刷新 当我将更新面
  • D3 网格中的力模拟

    我想知道如何修改Mike Bostock 的多力布局示例 https bl ocks org mbostock 1021841为了尝试获得强制布局以对网格中的节点进行分组 让我们假设我们有以下 csv Name Category1 Cate
  • 从字符串创建可变长度数组

    字符串 string a b c d 应该创建一个像这样的数组 array a gt array b gt array 我想出了这个 function create array arr string data parts explode s
  • Webpack 警告:您可能需要适当的加载器来处理此文件类型 (date-nfs)

    我的应用程序有问题 我有一个网站 我使用 date fns 根据用户语言显示格式化日期 它工作得很好 但我更新了 date fns 从那以后我收到了一个警告 在我的 JavaScript 代码中我使用 const locale requir
  • 尝试/捕获或验证速度?

    我正在使用 Python 每当我必须验证函数输入时 我都会假设输入有效 然后捕获错误 就我而言 我有一个通用的Vector 我用它来做一些不同的事情 其中 之一就是加法 它的功能既是Color 类并作为Vector 所以当我向Color 它
  • 如何在 Android 中从全名中拆分名字和姓氏字符串

    我有一张带有全名的表格EditText字段 我想将字符串分解为名字和姓氏字符串 谁可以帮我这个事 我可以知道实现我的目标的正确方法是什么吗 如果用户输入他 她的名字 例如A B C 名字将是A 姓氏遗嘱BC 我正在尝试这个 EditText
  • 在 google chrome 版本 54 中,禁用字段是不可选择的

    似乎在上次 google chrome 版本 54 更新后 我无法通过鼠标文本从我的网站中的禁用字段中进行选择 Text inside this input not selectable by mouse but before it was
  • cuda & rdc & 推入多个共享对象会在 registerEntryFunction 中产生 SIGSEV

    我正在尝试在两个共享库中运行可重定位设备代码 两者都使用 cuda thrust 如果我停止在 kernel cu 中使用推力 一切都会正常运行 这不是一个选项 编辑 如果 rdc 被禁用 该程序也可以工作 对我来说也不是一个选择 它编译得