cuPrintf问题

2024-01-14

我正在尝试将结构数组复制到设备。我正在使用一个 GPU atm,并且我使用 cuPrintf 函数来调试代码时遇到问题。

我的结构定义如下:

 struct Node
 {
        char Key[25];
        char ConsAlterKey[25];
        char MasterKey[3];
        int VowelDeletion;
        char Data[6];
        char MasterData[6];
        int Children[35];
        int ChildCount;
 };

为了测试目的,我像这样填充结构数组:

void FillArray(Node *NodeArray)
{       
    for(int i=0;i<TotalNodeCount;i++)
    {
            strcpy(NodeArray[i].Key,"Key");

            strcpy(NodeArray[i].ConsAlterKey,"ConsAlterKey");

            strcpy(NodeArray[i].MasterKey,"Mk");

            NodeArray[i].VowelDeletion=0;

            strcpy(NodeArray[i].Data,"Data");

            strcpy(NodeArray[i].MasterData,"Mdata");

            NodeArray[i].ChildCount=5;

            for(int j =0;j<NodeArray[i].ChildCount;j++)
            {
                    NodeArray[i].Children[j]=i+j;
            }
    }
}

我的主要功能如下所示:

int main()
{
    Node *NodeArray;
    Node *GpuTree;
    int tokenCount=0;
    int *tokenCountGPU;

    NodeArray =(Node *)malloc(sizeof(Node)*(TotalNodeCount));
    FillArray(NodeArray);
    printf("Filling test : %s\n", NodeArray[13].Key);

    gpuAssert(cudaMalloc( (void**)&GpuTree, sizeof(Node)*(TotalNodeCount)));
    gpuAssert(cudaMemcpy(GpuTree, NodeArray,sizeof(Node)*(TotalNodeCount), cudaMemcpyHostToDevice));

    //test value
    tokenCount=35;


    gpuAssert( cudaMalloc((void **)&tokenCountGPU, sizeof(int)) );
    gpuAssert( cudaMemcpy(tokenCountGPU, &tokenCount, sizeof(int), cudaMemcpyHostToDevice) );

    cudaPrintfInit();
    Test <<< 1, tokenCount >>> (GpuTree,tokenCountGPU);
    cudaPrintfDisplay(stdout, true);
    cudaPrintfEnd();
    gpuAssert( cudaGetLastError() );

    //TODO:free pointers
    return(0);
}

如果我编写测试函数如下:

__global__ void Test(Node *Trie,int *tokenCount)
{
    if (threadIdx.x < *tokenCount) 
    {
            cuPrintf("%s\n",Trie[threadIdx.x].Key);

    }   
    return;
}

我得到这样的输出:

Filling test : Key
[0, 0]: <
[0, 1]: ¶☺!
[0, 2]: ì☺!
[0, 3]: Ä☻!
[0, 4]: o♥!
[0, 5]: t♦!
[0, 6]: L♣!
[0, 7]: $♠!
[0, 8]: ü♠!
[0, 9]: Ô!
[0, 10]: !
[0, 11]: "
[0, 12]: \
!
[0, 13]: 4♂!
[0, 14]: ♀♀!
[0, 15]: ä♀!
!0, 16]: ¼
[0, 17]: "♫!
[0, 18]: l☼!
[0, 19]: D►!
[0, 20]: ∟◄!
[0, 21]: ô◄!
[0, 22]: Ì↕!
[0, 23]: ¤‼!
[0, 24]: |¶!
[0, 25]: T§!
[0, 26]: ,▬!
[0, 27]: ♦↨!
[0, 28]: Ü↨!
[0, 29]: ´↑!
[0, 30]: O↓!
[0, 31]: d→!
[0, 32]: <←!
[0, 33]: ¶∟!
[0, 34]: ì∟!

但如果我将测试方法更改为:

__global__ void Test(Node *Trie,int *tokenCount)
{
    if (threadIdx.x < *tokenCount) 
    {
        cuPrintf("%c%c%c\n",
                            Trie[threadIdx.x].Key[0],
                            Trie[threadIdx.x].Key[1],
                            Trie[threadIdx.x].Key[2]);
    }
    return;
}

然后我得到正确的输出:

Filling test : Key
[0, 0]: Key
[0, 1]: Key
[0, 2]: Key
[0, 3]: Key
[0, 4]: Key
[0, 5]: Key
[0, 6]: Key
[0, 7]: Key
[0, 8]: Key
[0, 9]: Key
[0, 10]: Key
[0, 11]: Key
[0, 12]: Key
[0, 13]: Key
[0, 14]: Key
[0, 15]: Key
[0, 16]: Key
[0, 17]: Key
[0, 18]: Key
[0, 19]: Key
[0, 20]: Key
[0, 21]: Key
[0, 22]: Key
[0, 23]: Key
[0, 24]: Key
[0, 25]: Key
[0, 26]: Key
[0, 27]: Key
[0, 28]: Key
[0, 29]: Key
[0, 30]: Key
[0, 31]: Key
[0, 32]: Key
[0, 33]: Key
[0, 34]: Key

所以问题是,当我尝试使用“%s”打印字符串时,为什么会得到损坏的输出?


这样问题就解决了。看来是因为cuPrintf的限制。事实上我并不知道他们。谢谢。

这是一个小测试:

__global__ void Test(Node *Trie,int *tokenCount)
{
    const char *Key="Key";
    char *KeyPointer="Key";
    char KeyArray[4]="Key";
    cuPrintf("Constant : %s - Array :%s  - Pointer : %s - Casting Pointer : %s - Casting Array : %s\n",Key, KeyArray,KeyPointer,(const char *)KeyPointer,(const char *)KeyArray);

    //cuPrintf("%s\n",Trie[threadIdx.x].Key);
    //cuPrintf("%d\n",*tokenCount);

}

给出输出:

    [0, 0]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 1]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 2]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 3]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 4]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 5]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 6]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 7]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 8]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 9]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 10]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 11]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 12]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 13]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 14]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 15]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 16]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 17]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 18]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 19]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 20]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 21]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 22]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 23]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 24]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 25]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 26]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 27]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 28]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 29]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 30]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 31]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 32]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 33]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
    [0, 34]: Constant : Key - Array :  - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key

看一下cuPrintf文档(自述文件位于C/src/simplePrintf/doc/cuPrintf_readme.htm来自安装 SDK 的基本目录):

使用上存在限制/已知问题cuPrintf,2号回答了你的问题:

限制/已知问题

目前,存在以下限制 并且限制适用于 cuPrintf:

  1. 缓冲区大小向上舍入到最接近的因子 256
  2. 与“%s”字符串格式说明符关联的参数必须是 类型(常量字符 *)
  3. 要打印 (const char *) 指针的值,它必须首先是 转换为 (char *)。全部(常量字符 *) 参数被解释为字符串
  4. 非零返回码与标准 C printf() 不匹配
  5. 无法异步输出 printf 缓冲区(即当内核处于 跑步)
  6. 隐式调用 cudaPrintfDisplay 会发出 cudaDeviceSynchronize()
  7. cuPrintfRestrict 应用的限制在以下时间仍然存在: 发射。要从 主机端,你必须调用 cudaPrintfEnd() 然后 cudaPrintfInit() 再次
  8. 如果将多个模块加载到一个中,则 cuPrintf 输出未定义 单一上下文
  9. 尽可能使用“-arch=sm_11”或更好的版本进行编译。缓冲区使用量为 效率更高,寄存器的使用是 降低
  10. 支持的格式说明符为:“cdiouxXeEfgGaAs”
  11. 格式说明符的行为,尤其是对齐/大小 说明符,取决于主机 printf 的机器实现
  12. cuPrintf 要求使用 CUDA 运行时 API 构建应用程序

在你的情况下你没有使用const char*论据。

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

cuPrintf问题 的相关文章

  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • MVC 中的 Blazor:组件被渲染,但 @onclick 不起作用。连接问题

    我正在尝试在 net core 3 MVC 项目中使用 Blazor 我使用了一些教程来做到这一点 例如https fizzylogic nl 2019 08 18 integrating blazor in an existing asp
  • 函数的不明确的引用/值版本

    考虑以下函数原型 void Remove SomeContainer Vec const std size t Index SomeContainer Remove SomeContainer Vec const std size t In
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • Visual Studio 2015 C# 找不到参考

    我在使用 Visual Studio 2015 和 C 时遇到了问题 在同一解决方案中添加对其他项目的引用时 Visual Studio 找不到所有类 例如 我创建了一个单元测试项目 我添加了对我创建的通信项目的引用 库中有 10 个类 但
  • ASP.NET 数据集 getdataBy 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值

    你好 我有一个非常简单的网络表单 我在此表单上有一个按钮和一个网格视图 以及一个包含链接表 bill docket docket bill 等的数据集 在按钮上单击我使用以下代码 protected void button click ob
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • memccpy 返回比 src 起始地址更低的内存地址

    我有一个学校项目 我必须重新编码memccpy 功能 我使用 2 个程序来检查我的代码是否正常工作 第一个是只有一个主程序的小程序 第二个程序是另一个学生开发的 可以找到here https github com yyang42 mouli
  • 为什么 cuCtxCreate 返回旧上下文?

    我已经安装了 CUDA SDK 4 2 64 CUDA工具包4 2 64 CUDA 驱动程序 4 2 64 我检查了 windows 中的每个 nvcuda dll 所有这些都是 4 2 版本 但是当我使用驱动程序 api 创建上下文并使用
  • 为什么Windsor只能拦截虚方法或接口方法?

    我正在阅读文档 发现如果不使用接口 那么 Windsor 只能拦截虚拟方法 这是 Windsor 的限制还是 C 语言的限制 我正在寻找深入的答案 C 语言在这里完全无关 问题是拦截在运行时级别如何工作 一种技术是从类继承 实现接口并将其用
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • 使用 Node.js 访问用 C++ 编写的 SDK

    我有一个用 C 语言编写的 SDK 可以与我的扫描仪设备进行通信 我需要开发一个可以访问扫描仪设备的电子应用程序 我知道有很多库可用于扫描仪 但我想使用这个 SDK 因为它允许我访问设备的完整功能 而且它是由设备制造商提供的 那么 有没有什
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后

随机推荐

  • 从 Django JSONField 获取值

    我正在尝试从模型中的 JSONField 检索值 但出现错误 Api 对象没有属性 openapi spec info title class Api models Model Model to hold infomation on the
  • 在 woocommerce 搜索中包含自定义字段值

    我尝试在 woocommerce 中包含自定义字段值search但我有一个问题 在 Google 和 Stack 上 我也看到了带有 pre get posts 的示例 所以我认为这是一个很好的方向 我编写了如下代码 function cu
  • MVC3 Html.DisplayFor -- 是否可以让该控件生成 ID?

    我希望能够显示一些文本 而且还可以通过 jQuery 修改文本 如果我使用 EditorFor 而不是 DisplayFor 我会看到输入控件的 ID 不过 我不希望该值以这种方式可编辑 因此 我将其设为 DisplayFor 但它不会为该
  • 类型必须满足静态生存期

    我正在尝试增加 Rust 和 GTK RS 应用程序的结构 但我不知道如何处理事件连接 我发现问题出在错误的生命周期中 但我真的不明白如何解决它 derive Debug struct CreatingProfileUI window gt
  • SQL 计数(*) 和非重复

    为什么我们不能使用count distinct 在 SQL 中 比如计算所有不同的行 select count from select distinct from MyTable as T 尽管我强烈建议您重新考虑使用的任何查询DISTIN
  • 是什么 ”?” php 中使用的 URL 中的符号?

    我是 PHP 新手 在学习PHP语言的过程中 我注意到 有些网站会出现这样的URL www website com profile php user roa3 我的问题 是什么 符号用于 如果我要开发一个 php 网站 我必须在 URL 中
  • 如何将 ImageMagick 环境变量传递给 nginx mongrels?

    我的 Rails 应用程序使用 ImageMagick 但应用程序在尝试执行 ImageMagick 命令 识别 时失败 我通过在 Apache 配置中传递以下环境变量解决了开发中的这个问题 我正在运行 Apache Passenger S
  • 我应该在 DTO 中使用构建器模式吗?

    这可能是一个相当主观的问题 但我想知道更多的意见 我使用 Spring MVC 构建了 Rest API 服务 并实现了 DTO 域 实体模式 我想知道您对实施该法案有何看法建造者模式 https en wikipedia org wiki
  • “ecb”不适用于 Cordova 和推送插件

    我尝试使用演示使用 PushNotification 注册我的设备 这不起作用 打印 Cordova PushNotification Plugin Demo 和 registering android 并查看警报 OK successHa
  • 在 Java 中应该使用什么舍入方法来计算金钱?

    假设我在 Java 中有一个代表金钱的十进制值 舍入这些值的最佳方法是什么 例如 如果我有一个根据税率计算的值 那么我最终会得到以下结果 5 3999999999999995作为税额 我是否应该将其四舍五入到小数点后两位 double d
  • 为什么我的 readFileSync 函数没有执行? [复制]

    这个问题在这里已经有答案了 我正在尝试从 Node js 中的文件中读取数据 这是我的代码 const cheerio require cheerio var fs require fs var path process argv 2 va
  • 使用 json_encode() 引号中的数字[重复]

    这个问题在这里已经有答案了 各种第三方公司迫使我们使用非常规代码并产生非标准输出 我们正在使用标准json encode 在 JS HTML 中输出 JSON 变量 如下所示 custom 1 2 2 7 3 5 现在他们告诉我们这对他们不
  • 在 UWP 中使用 RenderTargetBitmap 时出错

    我正在尝试创建位图图像 并具有以下代码 RenderTargetBitmap renderTargetBitmap new RenderTargetBitmap await renderTargetBitmap RenderAsync ui
  • 带有动态表单的 jquery 验证插件

    如何使用此代码 来自demo http jquery bassistance de validate demo ajaxSubmit intergration demo html 如果尚未创建表单 jQuery form validate
  • 如何使用 SPARQL 从 Wikidata 获取属性标签

    我正在使用 SPARQLWrapper 将 SPARQL 查询发送到 Wikidata 目前我正在尝试查找实体的所有属性 例如 使用一个简单的元组 例如 wd Q11663 a b 这本身是有效的 但我试图为返回的属性和实体找到人类可读的标
  • Firebase Admin SDK 应用操作代码进行电子邮件验证

    火力基地自定义电子邮件操作处理程序指南 https firebase google com docs auth custom email handler给出了在通过 Firebase 托管的网站的自定义 URL 上验证用户电子邮件地址的示例
  • Kafka Confluence:JDBC 接收器连接器中的删除模式给出错误,并且无法在“pk.fields”中使用复合键

    我有两个问题 1 我启用了delete enabled as true 但由于它需要pk mode被设置为record key我无法使用 MySQL 表的复合键 因为我可以在设置时使用pk mode as record value 我尝试在
  • 解决 Clang 下缺乏 Yz 机器约束的问题?

    我们使用内联汇编来使 SHA 指令可用 如果 SHA 没有定义 在 GCC 下我们使用 GCC INLINE m128i GCC INLINE ATTRIB MM SHA256RNDS2 EPU32 m128i a const m128i
  • Java中使用幂法计算n次方根

    我试图在java中使用得到立方根Math pow n 1 0 3 但因为它除以双精度数 所以它不会返回确切的答案 例如 对于 125 结果为 4 9999999999 有解决方法吗 我知道有一个立方根函数 但我想解决这个问题 以便我可以计算
  • cuPrintf问题

    我正在尝试将结构数组复制到设备 我正在使用一个 GPU atm 并且我使用 cuPrintf 函数来调试代码时遇到问题 我的结构定义如下 struct Node char Key 25 char ConsAlterKey 25 char M