使用 CUDA 生成排列

2024-03-07

我正在阅读有关 CUDA 的内容,我尝试实现一个简单的代码来创建每个可能的排列array {a,b,c,d},但我不知道如何实现 CUDA 方式(因为我读到的所有示例都是这种形式a[blockIdx.x] = b[blockIdx.x] + c[blockIdx.x] ).

任何帮助将不胜感激。


下面是 CUDA 中并行排列生成器的一个比较简单的实现。该示例旨在生成所有可能的排列ABCD.

由于所有可能的排列都可以通过将第一个符号固定为(例如)来生成:X并附加剩余符号的所有可能排列,然后将第一个符号更改为,例如Y再次执行上述过程,代码背后的简单思想是指定4线程来完成这项工作,每个线程引用不同的初始符号。

第一个符号后面的排列以规范方式计算,即通过递归。

显然,下面的代码可以变得更通用,也许还可以改进,但它应该给您一个初步的粗略想法。

#include <stdio.h>

inline void GPUassert(cudaError_t code, char * file, int line, bool Abort=true)
{
    if (code != 0) {
        fprintf(stderr, "GPUassert: %s %s %d\n", cudaGetErrorString(code),file,line);
        if (Abort) exit(code);
    }       
}

#define GPUerrchk(ans) { GPUassert((ans), __FILE__, __LINE__); }

__host__ __device__ void swap(char *x, char *y)
{
    char temp;
    temp = *x;
    *x = *y;
    *y = temp;
}

__device__ void permute_device(char *a, int i, int n, int tid, int* count) 
{
    if (i == n) { 
        char b[4]; char* c = a - 1; 
        b[0] = c[0]; b[1] = c[1]; b[2] = c[2]; b[3] = c[3];
        printf("Permutation nr. %i from thread nr. %i is equal to %s\n", count[0], tid, c); count[0] = count[0] + 1; 
    }
    else
    {
        for (int j = i; j <= n; j++)
        {
            swap((a+i), (a+j));
            permute_device(a, i+1, n, tid, count);
            swap((a+i), (a+j)); //backtrack
        }
    }
} 

__global__ void permute_kernel(char* d_A, int size) {

    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    int count[1]; count[0] = 0;

    char local_array[4];

    for (int i=0; i<size; i++) local_array[i] = d_A[i];

    swap(local_array+threadIdx.x,local_array);
    permute_device(local_array+1,0,2,tid,count);

}

int main()
{
    char h_a[] = "ABCD";

    char* d_a; cudaMalloc((void**)&d_a,sizeof(h_a));
    GPUerrchk(cudaMemcpy(d_a, h_a, sizeof(h_a), cudaMemcpyHostToDevice));

    printf("\n\n Permutations on GPU\n");
    permute_kernel<<<1,4>>>(d_a, 4);
    GPUerrchk(cudaPeekAtLastError());
    GPUerrchk(cudaDeviceSynchronize());

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

使用 CUDA 生成排列 的相关文章

  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • React Routing 在本地有效,但在 Heroku 中无效

    我的问题与中概述的问题即使不完全相同 也非常相似this https stackoverflow com questions 41772411 react routing works in local machine but not her
  • Remix 上没有自动完成/代码完成功能?

    我在 Youtube 上观看 Remix 上的教程 他在输入代码时具有自动完成功能 但我没有 有谁知道如何启用它 这将帮助我更轻松地编写代码 但我在任何地方都找不到解决方案 对我来说 只需点击左下角的 设置 按钮并启用 在编辑器中启用代码完
  • Docker构建特定的本地git分支

    我是 docker 新手 想要容器化我的应用程序的特定 git 分支 如果我运行 docker build 并给出 dockerfile 的位置 则会构建一个图像 但默认情况下从本地 master 分支构建 我希望能够要构建另一个分支 请说
  • 将 node.js 服务器端代码移植到 HTML5 WebSockets

    注意 这不是关于同时使用 node js 和 HTML5 套接字 我也没有兴趣讨论我所描述的设置的优点 node js 在服务器上运行 并且由于它支持通过套接字连接作为客户 它可以充当 HTML5 JS 客户端和使用 TCP IP 的服务器
  • 为什么.NET中没有IDateTimeProvider而DateTime有Now getter?

    目前 我正在为执行日期时间特定验证的组件编写单元测试 我创造了IDateTimeProvider接口 用作DateTime UtcNow包装器和业务对象使用接口而不是DateTime直接地 看来 DateTime 有点过载 应该分为一个值和
  • 页内分析不起作用

    当尝试在 Firefox 中查看页内分析时 我收到以下消息 加载页内分析时出现问题 我们发现您的设置存在问题 这些可能会导致加载页内分析时出现问题 您的网站不会从 Google 加载 ga js 如果您在自己的服务器上托管 Google 跟
  • 在 NGS 数据中查找 CDR

    我有数百万个fasta格式的序列 想要提取CDR CDR1 CDR2和CDR3 我只选择了一个序列作为示例 并尝试提取CDR1 但无法提取CDR1 顺序 FYSHSAVTLDESGGGLQTPGGGLSLVCKASGFTFSSYGMMWVR
  • Pycharm 安装抱怨 OpenJDK

    我尝试在 Ubuntu 12 04 上安装 Pycharm 我有以下信息 user user Pobrane pycharm 2 5 2 bin sh pycharm sh OpenJDK Runtime Environment IcedT
  • 通过 SSL 的 REST WCF 服务

    我正在尝试通过 SSL 配置 REST WCF 服务 但我不断收到 找不到基地址 与端点的方案 https 匹配 与绑定 WebHttpBinding 注册基地址方案是 http 有人可以看一下我的配置文件吗 谢谢
  • 如何在 OpenSSL 中使用 AES-128-ECB Alg 生成带有 PEM 编码的 PKCS8 密钥

    我想知道如何使用 openssl cmd 生成以下密钥 AES 128 ECB BEGIN PRIVATE KEY Proc Type 4 ENCRYPTED DEK Info AES 128 ECB 379AB79E55059F9A ga
  • C++ Typedef 和运算符重载

    如果你定义一个类似的类型typedef int MY INT 并继续重载 MY INT 的加法运算符 例如 MY INT operator MY INT a MY INT b will MY INT a b a b 不同于 int A B
  • FirstOrDefault() 无法与 ?? 结合操作员

    据我所知 linq 方法FirstOrDefault 回报null如果记录集为空 为什么不能使用 针对函数的运算符 就像这样 Double d new Double FirstOrDefault 0 0 Update 我不想检查是否d is
  • Abs、sign 等在 F# 中是如何实现的

    我找到 abs 10 abs 10L 两者都有效 于是我想知道F 是如何实现的 并在源代码中进行了搜索 type AbsDynamicImplTable lt T gt let AbsDynamic x AbsDynamicImplTabl
  • 给定一个完全由字符串元组列表表示的线性顺序,将该顺序输出为字符串列表

    给定形式的项目对 a b where a b means a gt b 例如 best better best good better good 我想输出一个表单列表 best better good 由于某种原因 这非常困难 有什么想法吗
  • 如何使用node.js基于id(transectionid)组合两个集合?

    我有横切和购买集合 其中包含横切和购买详细信息 现在我想将其转换为单个集合 基于横断面 我们需要合并文档 以下是我的横断面收集数据 transectionid 1 transectionamount 2000 transectiondate
  • 如何从备份文件中检索数据库的逻辑文件名

    我正在研究如何的步骤使用 SQL 脚本 T SQL 恢复数据库备份 http blog sqlauthority com 2007 02 25 sql server restore database backup using sql scr
  • 如何确定 JNI 全局引用内存泄漏的原因?

    我正在使用 Tomcat 停止我的 Web 应用程序后仍然存在对类加载器的引用我的网络应用程序的实例 结果是大量内存 主要与静态数据相关 将不会被释放 迟早这会导致OutOfMemoryError 我拍了一张heap dump我意识到它是由
  • VLC录制rtsp流

    我在使用 VLC 播放器录制 rtsp 流时遇到问题 实际上我的方法在 MacOS X 中有效 但在 Windows 中无效 命令行 vlc vvv rtsp admin email protected cdn cgi l email pr
  • 如何使用 Powershell 枚举 IIS 网站并查找每个网站的应用程序池?

    我可以使用以下方式搜索网站 Get WmiObject Namespace root WebAdministration Class Site Authentication PacketPrivacy ComputerName server
  • 使用 CUDA 生成排列

    我正在阅读有关 CUDA 的内容 我尝试实现一个简单的代码来创建每个可能的排列array a b c d 但我不知道如何实现 CUDA 方式 因为我读到的所有示例都是这种形式a blockIdx x b blockIdx x c block