所有,我编写了一个非常简单的 OpenCL 内核,它使用简单的平均将 RGB 图像转换为灰度。
一些背景:
clEnqueueMapBuffer
)并且是 8 bppclCreateBuffer
),一个是专门读的(我们clWriteBuffer
在内核启动之前进入),另一个是专门写的(我们clReadBuffer
在内核完成之后)我在 1280x960 图像上运行它。该算法的串行版本平均为 60ms,OpenCL 内核平均为 200ms!!!我做错了,但我不知道如何继续,优化什么。(在没有内核调用的情况下为我的读/写计时,算法在 15 毫秒内运行)
我正在附加内核设置(大小和参数)以及内核
编辑:所以我写了一个更笨的内核,它内部没有全局内存访问,而且只有 150 毫秒......这仍然非常慢。我想也许我搞砸了全局内存读取,它们必须是 4 字节对齐的还是什么?不...
编辑2:从我的内核中删除所有参数给了我显着的加速......我很困惑我认为因为我是clEnqueueWriteBuffer
内核应该不从主机->设备和设备->主机进行内存传输...... .
编辑3:想通了,但我仍然不明白为什么。如果有人能解释一下,我很乐意为他们提供正确的答案。问题是按值传递自定义结构。看起来我需要为他们分配一个全局内存位置并传递他们的cl_mem
s
内核调用:
//Copy input to device
result = clEnqueueWriteBuffer(handles->queue, d_input_data, CL_TRUE, 0, h_input.widthStep*h_input.height, (void *)input->imageData, 0, 0, 0);
if(check_result(result, "opencl_rgb_to_gray", "Failed to write to input buffer on device!")) return 0;
//Set kernel arguments
result = …
Run Code Online (Sandbox Code Playgroud) 我试图在Windows VS命令提示符中构建可执行文件和一些相关的dll.该项目附带一个scons文件,所以我只需在VS Cmd提示符中输入scons即可.
可执行文件正在"x86"VS Cmd提示符中构建.但是,运行时,可执行文件不是32位(使用任务管理器确认.)我的同事使用scons文件在他的64位计算机上构建相同的项目,并且他的可执行文件在我的计算机上是32位.(再次与任务经理确认)
dll是由32位JVM加载的,因为它们是64位,所以它们会抛出一个错误.我的同事dll不会.
我们无法弄清楚为什么我的计算机在"x86"VS环境中强制进行64位构建.有没有人有什么建议?
PS - 我有MS VS 2010,他有MS VS 2010 Express.
PSS - 我有64位python,因此我的scons也是64位.然而,我的同事也是如此.
我非常困惑为什么以下演员不起作用:
ScheduledThreadPoolExecutor timeoutControl = (ScheduledThreadPoolExecutor) Executors.newSingleThreadScheduledExecutor();
Run Code Online (Sandbox Code Playgroud)
ScheduledThreadPoolExecutor 实现 ScheduledExecutorService。如果我不能在实际的类中使用它,那么这个 Executors 调用有什么意义呢?
我使用它是否错误(可能),有人可以提供一些指导吗?
克隆cv::Mat
. 调用了两个函数,并处理m_mask
我的类的成员变量(不是指针):
设置掩码:
void SetMask(QImage mask)
{
if(!mask.isNull() && mask.depth() == 1)
{
std::cout << "Mask width: " << mask.width() << " and mask height: " << mask.height() << std::endl << std::flush;
if(mask.width() != m_mask.cols || mask.height() != m_mask.rows)
m_mask.create(mask.height(), mask.width(), CV_8UC1);
if(m_mask.data == 0)
std::cout << "MALLOC FAILED" << std::endl << std::flush;
//Copy data here
cv::imshow("OpenCV Image", m_mask);
}
else
m_mask = cv::Scalar(0);
}
Run Code Online (Sandbox Code Playgroud)
然后使用面膜:
QString MaskToXML()
{
QString xml_out;
if(!m_mask.empty())
{
cv::Mat workspace = …
Run Code Online (Sandbox Code Playgroud) Eclipse有一个很棒的东西叫做Quick Outline CTRL+ O.我想要类似但有类的东西,因为我正在进入一个包含大量类的新项目,并且不知道它们来自哪个源文件.
示例:按CTRL+ Shift+ O列出所有类,开始键入它修改列表,按Enter键,打开该源文件.
Eclipse中是否存在此功能?我查看Keys
菜单,找不到任何东西,可能没有使用正确的名称.
我正在尝试从命令行运行VLCJ测试jar。VLCJ需要两个外部JAR
如果将这些jar与尝试运行的可执行jar放在同一目录中,则可以成功运行它。但是,如果我将它们放在自己的目录中并执行以下操作:
java -classpath "C:\Users\Constantin\workspace\Java Libraries\JNA" -jar executable.jar
Run Code Online (Sandbox Code Playgroud)
它无法从JNA库中找到一个类。我是Java的新手,我的搜索没有揭示可能的答案。所以我希望有人可以帮助回答:
我该如何调试?为什么找不到罐子?我的-classpath做错了吗?
先感谢您!
康斯坦丁
我有一个函数,它通过串行发送命令,然后接收未知大小的响应.运用
(ioctl(fd_, FIONREAD, &bytes_in_buffer);
Run Code Online (Sandbox Code Playgroud)
我确定需要为阅读分配多少内存.
//This code calls the function below
unsigned char CheckRefresh[] = {254, 124, 0};
unsigned char * response;
unsigned int size;
relay_board->SendCustomCommand(CheckRefresh, 3, &response, size);
ErrorCode SendCustomCommand(unsigned char * command, unsigned int command_size, unsigned char **response, unsigned int &response_size)
{
//Send the command
write(fd_, command, command_size);
// ... Omitting Polling Code to Get correct number of bytes ...
(ioctl(fd_, FIONREAD, &bytes_in_buffer);
//Now getting the response
response_size = (unsigned int)bytes_in_buffer;
(*response) = new unsigned char(response_size);
if(read(fd_, *response, …
Run Code Online (Sandbox Code Playgroud) 所有,我试图在反向列表中的元素之间进行O(n ^ 2)比较,所以我使用反向迭代器.
代码如下
#include <list>
struct Element {
double a;
double b;
};
typedef std::list<Element> ElementList;
class DoStuff {
public:
DoStuff();
void removeDuplicates(ElementList & incList) const {
for(ElementList::reverse_iterator stackIter = incList.rbegin(); stackIter != incList.rend(); ++stackIter) {
bool uniqueElement = true;
for(ElementList::reverse_iterator searchIter = stackIter+1; searchIter != incList.rend() && uniqueElement; ++searchIter) {
//Check stuff and make uniqueElement = true;
}
}
}
};
int main() {
std::list<Element> fullList;
DoStuff foo;
foo.removeDuplicates(fullList);
}
Run Code Online (Sandbox Code Playgroud)
我在searchIter
创建时遇到编译错误......为什么......
这是有效的,但它的愚蠢阅读:
ElementList::reverse_iterator searchIter = stackIter; …
Run Code Online (Sandbox Code Playgroud)