小编Con*_*tin的帖子

OpenCL 内核的执行速度比单线程慢

所有,我编写了一个非常简单的 OpenCL 内核,它使用简单的平均将 RGB 图像转换为灰度。

一些背景:

  1. 图像存储在映射内存中,作为 24 位非填充内存块
  2. 输出数组存储在固定内存中(用 映射clEnqueueMapBuffer)并且是 8 bpp
  3. 设备上分配了两个缓冲区(clCreateBuffer),一个是专门读的(我们clWriteBuffer在内核启动之前进入),另一个是专门写的(我们clReadBuffer在内核完成之后)

我在 1280x960 图像上运行它。该算法的串行版本平均为 60ms,OpenCL 内核平均为 200ms!!!我做错了,但我不知道如何继续,优化什么。(在没有内核调用的情况下为我的读/写计时,算法在 15 毫秒内运行)

我正在附加内核设置(大小和参数)以及内核


编辑:所以我写了一个更笨的内核,它内部没有全局内存访问,而且只有 150 毫秒......这仍然非常慢。我想也许我搞砸了全局内存读取,它们必须是 4 字节对齐的还是什么?不...

编辑2:从我的内核中删除所有参数给了我显着的加速......我很困惑我认为因为我是clEnqueueWriteBuffer内核应该不从主机->设备和设备->主机进行内存传输...... .

编辑3:想通了,但我仍然不明白为什么。如果有人能解释一下,我很乐意为他们提供正确的答案。问题是按值传递自定义结构。看起来我需要为他们分配一个全局内存位置并传递他们的cl_mems


内核调用:

//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)

c optimization gpgpu opencl

4
推荐指数
1
解决办法
1853
查看次数

Visual Studio命令编译器强制64位编译

我试图在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位.然而,我的同事也是如此.

c++ windows scons 32bit-64bit visual-studio

3
推荐指数
1
解决办法
2700
查看次数

使用执行器创建 ScheduledThreadPoolExecutor

我非常困惑为什么以下演员不起作用:

ScheduledThreadPoolExecutor timeoutControl = (ScheduledThreadPoolExecutor) Executors.newSingleThreadScheduledExecutor();
Run Code Online (Sandbox Code Playgroud)

ScheduledThreadPoolExecutor 实现 ScheduledExecutorService。如果我不能在实际的类中使用它,那么这个 Executors 调用有什么意义呢?

我使用它是否错误(可能),有人可以提供一些指导吗?

java java.util.concurrent

3
推荐指数
1
解决办法
4292
查看次数

cv::::Mat 克隆段错误

克隆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)

c++ qt opencv

3
推荐指数
1
解决办法
2853
查看次数

Eclipse键盘快捷键列出项目中的所有类

Eclipse有一个很棒的东西叫做Quick Outline CTRL+ O.我想要类似但有类的东西,因为我正在进入一个包含大量类的新项目,并且不知道它们来自哪个源文件.

示例:按CTRL+ Shift+ O列出所有类,开始键入它修改列表,按Enter键,打开该源文件.

Eclipse中是否存在此功能?我查看Keys菜单,找不到任何东西,可能没有使用正确的名称.

java eclipse

2
推荐指数
1
解决办法
2万
查看次数

设置类路径仍然找不到外部jar

我正在尝试从命令行运行VLCJ测试jar。VLCJ需要两个外部JAR

  • jna.jar
  • platform.jar

如果将这些jar与尝试运行的可执行jar放在同一目录中,则可以成功运行它。但是,如果我将它们放在自己的目录中并执行以下操作:

java -classpath "C:\Users\Constantin\workspace\Java Libraries\JNA" -jar executable.jar
Run Code Online (Sandbox Code Playgroud)

它无法从JNA库中找到一个类。我是Java的新手,我的搜索没有揭示可能的答案。所以我希望有人可以帮助回答:

我该如何调试?为什么找不到罐子?我的-classpath做错了吗?

先感谢您!

康斯坦丁

java vlcj

1
推荐指数
1
解决办法
5855
查看次数

在函数中分配内存以返回给用户

我有一个函数,它通过串行发送命令,然后接收未知大小的响应.运用

(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)

c++ heap-corruption

0
推荐指数
1
解决办法
101
查看次数

反向迭代算术

所有,我试图在反向列表中的元素之间进行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)

c++ stl

0
推荐指数
1
解决办法
154
查看次数