小编Wiz*_*ard的帖子

将 GPU 数据从 python (pycuda gpuarray) 交换到 opencv (cv::cuda::GpuMat),反之亦然

我有一个 pycuda gpuarray,我想将其提供给 opencv cuda 函数。据我了解,目前 opencv 3 cv::cuda 模块没有 python 绑定。所以我尝试编写自己的 python 包装器来访问 cv::cuda 函数(在我的例子中是 cv::cuda::HOG 类)。

不幸的是,当涉及到数据交换的核心部分时,我遇到了障碍。我知道你可以使用类似的结构

static PyObject* my_function(PyObject* self, PyObject* args)
{
  int test;
  PyArg_ParseTuple(args, "t", &test);
}
Run Code Online (Sandbox Code Playgroud)

传递基本数据类型,但我不知道如何使用 GPU 内存上的指针来实现这一点(在我的例子中gpuarray.gpudata)。我的理解是gpuarray.gpudata根据gpu 上的但dtype产生一个指针。gpuarray

所以在 python 方面,事情看起来像这样:

input_gpu = gpuarray.zeros(shape=(3,3), dtype=numpy.float32)
output_gpu = gpuarray.zeros(shape=(3,3), dtype=numpy.float32)
my_function(input.gpudata, output.gpudata)
Run Code Online (Sandbox Code Playgroud)

在 C++ 方面,我必须使用cv:cuda::GpuMat,那么如何从gpuarray.gpudatacv:cuda::GpuMat,反之亦然?

python opencv pycuda

5
推荐指数
0
解决办法
1086
查看次数

在单个 MTLRenderCommandEncoder 中使用多个渲染管道:如何同步 MTLBuffer?

中心问题
我在一个渲染命令编码器中有两个渲染管道。第一个管道写入在第二个管道中使用的缓冲区。这似乎不起作用,我希望这是一个同步问题。当我为每个渲染管道使用一个单独的渲染命令编码器时,我得到了想要的结果。这可以用一个单一的渲染命令编码器来解决,还是我需要两个单独的编码器来同步缓冲区?

这是更具体的情况:
第一个管道是非光栅化管道,仅运行顶点着色器以输出到MTLBuffer存储MTLDrawPrimitivesIndirectArguments以用于drawPrimitives调用第二个管道,如下所示:

// renderCommandEncoder is MTLRenderCommandEncoder
// firstPipelineState and secondPipelineState are two different MTLRenderPipelineState
// indirectArgumentsBuffer is a MTLBuffer containing MTLDrawPrimitivesIndirectArguments
// numberOfVertices is number of vertices suited for first pipeline

// first pipeline
renderCommandEncoder.setRenderPipelineState(firstPipelineState)
renderCommandEncoder.setVertexBuffer(indirectArgumentsBuffer, offset: 0, index: 0)
renderCommandEncoder.drawPrimitives(type: .point, vertexStart: 0, vertexCount: numberOfVertices)

// second pipeline
renderCommandEncoder.setRenderPipelineState(secondPipelineState)
renderCommandEncoder.setVertexBuffer(secondPipelineBuffer, offset: 0, index: 0)
renderCommandEncoder.drawPrimitives(type: .point, indirectBuffer: indirectArgumentsBuffer, indirectBufferOffset: 0)

renderCommandEncoder.endEncoding()
Run Code Online (Sandbox Code Playgroud)

indirectArgumentsBuffer在发出drawPrimitives对第二个管道的调用时,如何确保第一个管道已写入 ,该管道使用并需要 的内容indirectArgumentsBuffer

objective-c swift metal

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

python脚本挂起导入模块与多处理代码

我正在尝试导入一个简单的模块,它使用多处理到我的主文件中.使用多处理的模块从a获得计算结果asyncresult.get().通过导入脚本调用此例程时,只会挂起并且不会继续.

这是一个小例子.

import_test.py(要导入的模块)

import sys
import multiprocessing as mp

if not hasattr(sys.stdin, 'close'):
    def dummy_close():
        pass
    sys.stdin.close = dummy_close

# simple test function to compute in parallel
def testf(x):
    return x*x

# multiprocessing code
pool = mp.Pool()
results = []
for i in range(0,2):
    results.append(pool.apply_async(testf, [i]))
for i in range(0,2):
    print results[i].get()
pool.close()
pool.join()
Run Code Online (Sandbox Code Playgroud)

main.py(简单的脚本只导入代码,应该从import_test打印)

if __name__ == '__main__':
    import import_test

print "done"
Run Code Online (Sandbox Code Playgroud)

运行脚本时,我可以看到导入发生,但第一次results[i].get()(asyncresult.get()例程)被调用整个脚本挂起并且不会继续而不会抛出任何错误.我在Mac OS X(El Capitan)和Windows 10下运行了两个明显不同的python设置.结果始终是上述行为.

如果我只是将导入模块中的代码放入其中,那么一切正常main.py.当然我的实际代码比这更复杂,我想在要导入的模块中保持并行计算.

我该如何解决这个问题?

python multiprocessing python-multiprocessing

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

iOS 12、Xcode 10:UIView setNeedsDisplay(_:) 似乎已损坏

更新到 Xcode 10 后,我意识到draw(_ rect: CGRect)我的应用程序中自定义 UIView(从 UIView 派生的类)的例程被调用了错误的rect. 事实上,它总是以rect底层 UIView 的完整框架被调用,而不是rectsetNeedsDisplay(_ rect: CGRect).

这是一个可以作为游乐场运行的代码片段,至少在我的设置中,它显示了上面在简约设置中描述的错误行为:

import Foundation
import UIKit
import PlaygroundSupport

class CustomView: UIView {
    override func draw(_ rect: CGRect) {
        print("rect = \(rect)")
    }
}

let customView = CustomView(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 200.0, height: 200.0)))
PlaygroundPage.current.liveView = customView
print("test")
customView.setNeedsDisplay(CGRect(origin: CGPoint.zero, size: CGSize(width: 100.0, height: 100.0)))
Run Code Online (Sandbox Code Playgroud)

我得到的输出是

rect = (0.0, 0.0, 200.0, 200.0)
测试
rect = (0.0, 0.0, …

ios swift ios12 xcode10

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