- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些代码与此类似:
std::queue<unsigned> q;
q.push(array[0]);
while (!q.empty())
{
unsigned index = q.front();
q.pop();
if(index >= someval){
index = index - someval;
q.push(array[index]);
}
else{
//do something
}
}
}
我想将其移至 OpenCL 内核,我将如何以最有效的方式复制队列的功能。
目前我已经用一个固定大小的数组来实现它,它监视队列中元素的头部和计数。我想知道是否有更优雅的解决方案。
谢谢
最佳答案
您应该检查 SYCL:https://www.khronos.org/sycl其中 C++ 模板函数可以同时包含主机和设备代码,以构建使用 OpenCL 加速的复杂算法。如果您不能使用它并且您甚至没有 opencl 2.0 的设备:
1.2 版没有任何等效项。但是在评论中,你说:
Not sure that I understand what you mean but this would need to be individual to all threads on the GPU
那么就不需要线程间通信了,为了缓存+内存+计算效率,使用循环缓冲区实现一个FIFO应该很简单,只是不要溢出它(最多64个元素)并且不要下溢(弹出次数多于推送次数,但易于实现边界检查(具有性能损失)):
推
bool push(__private uint * stack, uint value)
{
// pushing from bot, so you can pop it from top later (FIFO)
// circular buffer for top performance
uint bufLen=64;
// zeroth element is counter for newest added element
// first element is oldest element
// circular buffer
uint nextIndex=(stack[0]%bufLen+2); // +2 because of top-bot headers
// if overflows, it overwrites oldest elements one by one
stack[nextIndex]=value;
// if overflows, it still increments
stack[0]++;
// simple and fast
return true;
}
检查是否为空
bool empty(__private uint * stack)
{
// tricky if you overflow both
return (stack[0]==stack[1]);
}
前值
uint front(__private uint * stack)
{
uint bufLen=64;
// oldest element value (top)
uint ptr=stack[1]%bufLen+2; // circular adr + 2 header
return stack[ptr];
}
弹出
uint pop(__private uint * stack)
{
uint bufLen=64;
uint ptr=stack[1]%bufLen+2;
// pop from top (oldest)
uint returnValue=stack[ptr];
stack[ptr]=0;
// this will be new top ctr for ptr
stack[1]++;
// if underflows, gets garbage, don't underflow
return returnValue;
}
用于基准测试的示例内核:
__kernel void queue0(__global uint * heap)
{
int id=get_global_id(0);
__private uint q[100];
for(int i=0;i<256;i++)
q[i]=0;
for(int i=0;i<55;i++)
push(q,i);
for(int i=0;i<40;i++)
pop(q);
for(int i=0;i<20;i++)
push(q,i);
for(int i=0;i<35;i++)
pop(q);
for(int i=0;i<35;i++)
{
push(q,i);
pop(q);
}
push(q,'h');
push(q,'e');
push(q,'l');
push(q,'l');
push(q,'o');
push(q,' ');
push(q,'w');
push(q,'o');
push(q,'r');
push(q,'l');
push(q,'d');
for(int i=0;i<256;i++)
heap[id*256+i]=q[i];
}
buffer的输出(显示thread id = 0的计算结果)
121 110 0 0 0 0 0 0 0 0 0 0 // 121 pushes total, 110 pops total
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
104 101 108 108 111 32 119 111 114 108 100 0
// hello world
超过 200k pushes+pops 在 6.35 毫秒内(运行内核 1024 个线程,每个线程处理 256 个元素,但仅使用 64+2 个元素作为循环缓冲区)对于 1 channel 1600MHz ddr3 RAM 和 Intel HD Graphics 400 with 12 compute单位(共 96 个核心 @600 MHz)。
如果您使用 64 x 4 元素循环缓冲区构造一个 64 元素循环缓冲区,您也可以在堆栈顶部和底部之间添加元素!
关于c++ - 是否有 OpenCL std::queue 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40720001/
我试图弄清楚以下模块正在做什么。 import Queue import multiprocessing import threading class BufferedReadQueue(Queue.
如果我使用 Queue.Queue,那么我的 read() 函数不起作用,为什么?但是,如果我使用 multiprocessing.Queue,它运行良好: from multiprocessing
我正在寻找比我在文档中找到的更多关于 Python 队列实现的见解。 根据我的理解,如果我在这方面有误,请原谅我的无知: queue.Queue():通过内存中的基本数组实现,因此不能在多个进程之间共
当我使用多处理模块(Windows 上的 Python 2.7)中的队列代替 Queue.Queue 时,我的程序没有完全关闭。 最终,我想使用 multiprocessing.Process 处理
阅读了大量的 JavaScript 事件循环教程,我看到了不同的术语来标识队列存储消息,当调用堆栈为空时,事件循环准备好获取消息: 队列 消息队列 事件队列 我找不到规范的术语来识别它。 甚至 MDN
我收到错误消息“类型队列不接受参数”。当我将更改队列行替换为 PriorityQueue 时,此错误消失并且编译正常。有什么区别以及如何将其更改为编译队列和常规队列? import java.util
如何将项目返回到 queue.Queue?如果任务失败,这在线程或多处理中很有用,这样任务就不会丢失。 docs for queue.Queue.get()说函数可以“从队列中删除并返回一个项目”,但
如何在多个 queue.Queue 上进行“选择”同时? Golang 有 desired feature及其 channel : select { case i1 = 声明。 线程:queue 模
http://docs.python.org/2/library/queue.html#Queue.Queue.put 这似乎是一个幼稚的问题,但我在文档和谷歌搜索中都没有找到答案,那么这些方法是线程
这可能是个愚蠢的问题,但我对与 .dequeue() 和 $.queue() 一起使用的 .queue() 感到困惑> 或 jquery.queue()。 它们是否相同,如果是,为什么 jquery
我正在尝试创建一个线程化的 tcp 流处理程序类线程和主线程对话,但是 Queue.Queue 也没有做我需要的,服务器从另一个程序接收数据,我只想传递它进入主线程进行处理这里是我到目前为止的代码:
The principal challenge of multi-threaded applications is coordinating threads that share data or ot
在Queue模块的queue类中,有几个方法,分别是qsize、empty 和 full,其文档声称它们“不可靠”。 他们到底有什么不可靠的地方? 我确实注意到 on the Python docs网
我需要一个队列,多个线程可以将内容放入其中,并且多个线程可以从中读取。 Python 至少有两个队列类,Queue.Queue 和 collections.deque,前者似乎在内部使用后者。两者都在
明天我将介绍我选择进程内消息队列实现的基本原理,但我无法阐明我的推理。我的合作设计者提议我们实现一个简单的异步队列,只使用基本的作业列表和互斥锁来控制访问,我建议在嵌入式模式下使用 ActiveMQ。
在 scala 中定义了一个特征: trait Queue[T] Queue 是一种类型吗?或其他东西,例如类型构造函数? 来自 http://artima.com/pins1ed/type-para
我看到 SML/NJ 包含一个队列结构。我不知道如何使用它。如何使用 SML/NJ 提供的附加库? 最佳答案 Queue structure SML '97 未指定,但它存在于 SML/NJ 的顶级环
我是 D3 和 JavaScript 的新手。 我试图理解其中的 queue.js。 我已经完成了 this关联。但是仍然无法清楚地了解 queue.await() 和 queue.awaitAll(
所以我试图在我的 main.cpp 文件中调用一个函数,但我得到“错误:没有匹配函数来调用‘Queue::Queue()。” 队列.h #ifndef QUEUE_H #define QUEUE_H
假设我有一个 10 行的二维 numpy 数组 例如 array([[ 23425. , 521331.40625], [ 23465. , 521246.03125],
我是一名优秀的程序员,十分优秀!