标签: pyopencl

这个OpenCL代码可以优化吗?

我工作在一张的OpenCL代码用于专门基质功能:对于Dx1向量v中,两个DxD矩阵AB以及恒定c,返回1xD向量r其中r[i] = c * sum_over_j (v[j] * A[i][j] * B[i][j])

以下是我到目前为止的情况,但它的运行速度非常慢.没有求和的返回DxD矩阵的版本大约快十倍.它是从PyOpenCL调用的,如果这有任何区别的话.

做错了什么?可以优化吗?

#define D 1000
...

   __kernel void element_mult(
      __global float *result,
      __global const float *vector,
      __global const float *matrix,
      __global const float *matrix2,
        const float factor)
      {
         int y = get_global_id(1);
         float sum = 0;
         for(int k = 0; k < D; k++)
         {
            sum += vector[k] * matrix[(y*D) + …
Run Code Online (Sandbox Code Playgroud)

gpgpu opencl pyopencl

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

Python LogicError:clGetPlatformIDs失败:未找到平台khr

在Ubuntu中为Python程序集进行鼻子测试时会发生错误:

devices = [ d for d in cl.get_platforms()[0].get_devices() if
LogicError: clGetPlatformIDs failed: platform not found khr


File "/home/fateeva/prog/deflectometry/SGMFMeasurement/_PhaseShifts.py", line 30, in <module>
    devices = [ d for d in cl.get_platforms()[0].get_devices() if
LogicError: clGetPlatformIDs failed: platform not found khr
Run Code Online (Sandbox Code Playgroud)

如何修复它?

ubuntu pyopencl

5
推荐指数
3
解决办法
6494
查看次数

没有名为pyopencl的模块(Py2exe)

在尝试从Py2Exe创建.exe时,我遇到了PyOpenCL模块的问题.Py2Exe使得.exe应该这样做(没有"ImportError:这里没有名为pyopencl的模块"),但是当我运行.exe时,它没有名为pyopencl的模块.

我正在尝试制作Phoenix Miner的.exe.

我的setup.py:

from distutils.core import setup
import py2exe, sys, os, pyopencl

sys.argv.append('py2exe')

setup(
    options = {'py2exe': {'bundle_files': 1,
                          "includes":["pyopencl","twisted",
                                      "zope","QueueReader",
                                      "numpy"]}},
    console=[{'script' : 'phoenix.py'}],
    data_files=["C:\\Users\\Nicklas\\Desktop\\Phoenix-Miner\\kernels\\poclbm\\kernel.cl"],
    zipfile = None,
)
Run Code Online (Sandbox Code Playgroud)

我找到了一个与我有同样问题的人http://bytes.com/topic/python/answers/848048-py2exe-module-error但没有解决方案.

更新:我发现导致此错误的原因.在pyopencl中__init__有一个名为_find_pyopencl_include_path的函数,它的功能非常自我解释.总而言之:imp模块无法找到pyopencl模块.为了解决这个问题,我注释掉了该行并将路径名设置为pyopencls包含目录的路径.可能不是一个好的解决方案.但这很容易解决.

python py2exe pyopencl

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

OpenCL矩阵乘法 - 得到错误的答案

这是一个简单的OpenCL矩阵乘法内核,它让我发疯:

顺便说一句,我正在使用pyopencl.

__kernel void matrixMul(  __global int* C,
                          __global int* A,
                          __global int* B,
                          int wA, int wB){

                int row = get_global_id(1); //2D Threas ID x
                int col = get_global_id(0); //2D Threas ID y

                //Perform dot-product accumulated into value
                int value = 0;
                for ( int k = 0; k < wA; k++ ){
                    value += A[row*wA + k] * B[k*wB+col];
                }
                C[row*wA+col] = value; //Write to the device memory
            }
Run Code Online (Sandbox Code Playgroud)

哪里(输入)

A = [72 45
     75 61]
B = …
Run Code Online (Sandbox Code Playgroud)

python opencl pyopencl

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

OpenCL和Python中的Bigint

我试图在Python中实现RSA,但我想在GPU上运行密集计算.我已经成功实现了我自己在PyOpenCL中运行的模数表达式,但我最大限度地使用了六位整数来表示基数和指数.比这更大的数字和GPU崩溃.

我需要在numpy中创建一个非常大的整数值数组,并将它们发送到PyOpenCL代码,并使用GPU上的大整数执行乘法和模运算.

以前有人做过类似的事吗?谷歌搜索cuda和bigint没有给出任何好结果.:(

python gpu opencl bigint pyopencl

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

OpenCL - 为什么使用READ_ONLY或WRITE_ONLY缓冲区

OpenCL,在那里标记缓冲区任何性能优势READ_ONLY还是WRITE_ONLY

kernel是我经常看到的(a READ_ONLY和b是WRITE_ONLY):

__kernel void two_buffer_double(__global float* a, __global float* b)
{
    int i = get_global_id(0);
    b[i] = a[i] * 2;
}
Run Code Online (Sandbox Code Playgroud)

kernel似乎更好,因为它使用较少的全局内存(a是READ_WRITE):

__kernel void one_buffer_double(__global float* a)
{
    int i = get_global_id(0);
    a[i] = a[i] * 2;
}
Run Code Online (Sandbox Code Playgroud)

不要READ_ONLYWRITE_ONLY标志就是为了要帮助调试和捕获错误?

flags buffer kernel opencl pyopencl

5
推荐指数
3
解决办法
4213
查看次数

为什么使用pyopencl.array.Array

PyOpenCL有两种创建OpenCL缓冲区的方法:

pyopencl.Buffer 采用numpy数组并将其转换为缓冲区.

pyopencl.array.Array获取一个numpy数组并将其转换为PyOpenCL数组 - 一个可以像numpy数组一样编辑的对象,但在调用.data它时提供缓冲区.

是否存在选择其中一个的性能/功能原因?或者我应该只选择使我的代码更具可读性的那个?

gpgpu numpy opencl pyopencl

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

pyOpenCL和opencl4py之间的区别

今天我偶然发现了stackoverflow中的帖子(另见这里):

我们正在开发opencl4py,更高级别的绑定.这个项目使用CFFI,所以它适用于Pypy.

我们遇到的pyopencl的主要问题是'import pyopencl'执行OpenCL初始化并在NVIDIA驱动程序的情况下获取整个虚拟内存,防止正确分叉并有效禁用多处理(是的,我们声称使用pyopencl禁用多处理至少使用NVIDIA ).opencl4py使用惰性OpenCL初始化,解决这个"导入地狱".

后来,它获得了一些很好的功能,如超级简单的二进制程序缓存等.不幸的是,文档有点简短.了解其工作原理的最佳方法是进行测试.

由于还有pyOpenCL,我想知道这两个包之间的区别是什么.有谁知道我在哪里可以找到关于这两个包的专业人士和骗子的概述?

编辑:包括benshope的评论,因为我也会感兴趣:"禁用[s]多处理"是什么意思?比如,它不能同时在几个设备上运行内核?

python opencl pyopencl

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

pyopencl - pycuda性能差异

将多个矩阵乘法计算与pyopencl和pycuda进行比较表明性能存在差异.

系统:

Ubuntu 14.04 with GeForce 920m
Run Code Online (Sandbox Code Playgroud)

Pyopencl代码:

#-*- coding: utf-8 -*-
import pyopencl as cl
import pyopencl.array 
from jinja2 import Template
import time
import numpy as np
from scipy.sparse import csr_matrix

KERNEL = Template("""
    {{header}}

    #include <pyopencl-complex.h>

    __kernel
    void complex_mat_mul(__global const {{complex_type}} *a, __global const {{complex_type}} *b, __global {{complex_type}} *res)
    {
        int row = get_local_id(1);
        int col = get_local_id(0);

        int mat_id = get_group_id(0) * get_num_groups(0) + get_group_id(1);

        //printf("mat_id: %d, row: %d, col: %d ----- ", mat_id, row, col);

        {{complex_type}} …
Run Code Online (Sandbox Code Playgroud)

performance pycuda pyopencl

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

如何使用Python多处理队列(通过PyOpenCL)访问GPU?

我的代码需要很长时间才能运行,因此我一直在研究Python的多处理库以加快处理速度。我的代码还包含一些通过PyOpenCL利用GPU的步骤。问题是,如果我将多个进程设置为同时运行,则它们最终都会尝试同时使用GPU,这通常会导致一个或多个进程抛出异常并退出。

为了解决此问题,我错开了每个过程的开始,以使它们不太可能相互碰撞:

process_list = []
num_procs = 4

# break data into chunks so each process gets it's own chunk of the data
data_chunks = chunks(data,num_procs)
for chunk in data_chunks:
    if len(chunk) == 0:
        continue
    # Instantiates the process
    p = multiprocessing.Process(target=test, args=(arg1,arg2))
    # Sticks the thread in a list so that it remains accessible
    process_list.append(p)

# Start threads
j = 1
for process in process_list:
    print('\nStarting process %i' % j)
    process.start()
    time.sleep(5)
    j += 1

for process in process_list: …
Run Code Online (Sandbox Code Playgroud)

python queue multiprocessing pyopencl

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