标签: pyopencl

如何在pyopencl中创建可变大小的__local内存?

在我的C OpenCL代码中,我clSetKernelArg用来创建'可变大小' __local内存以供在我的内核中使用,这在OpenCL本身并不可用.看我的例子:

clSetKernelArg(clKernel, ArgCounter++, sizeof(cl_mem), (void *)&d_B);
...
clSetKernelArg(clKernel, ArgCounter++, sizeof(float)*block_size*block_size, NULL);
...
kernel="    
    matrixMul(__global float* C,
                   ...
              __local float* A_temp,
                  ...
             )"
{...
Run Code Online (Sandbox Code Playgroud)

我的问题是现在,如何在pyopencl中做同样的事情?

我查看了pyopencl附带的示例,但我唯一能找到的是使用模板的方法,这对我来说就像我所理解的那样是一种矫枉过正.见例子.

kernel = """
        __kernel void matrixMul(__global float* C,...){
                     ... 
            __local float A_temp[ %(mem_size) ];
                     ...
        }
Run Code Online (Sandbox Code Playgroud)

您有什么推荐的吗?

python opencl pyopencl

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

在OpenCL中对偏移邻域构建操作的更快方法

如何在2D阵列的许多重叠但偏移的块上进行操作,以便在OpenCL中更有效地执行?

例如,我有以下OpenCL内核:

__kernel void test_kernel(
    read_only image2d_t src,
    write_only image2d_t dest,
    const int width,
    const int height
)
{
    const sampler_t sampler =  CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
    int2 pos = (int2)(get_global_id(0), get_global_id(1));
    int2 pos0 = (int2)(pos.x - pos.x % 16, pos.y - pos.y % 16);

    uint4 diff = (uint4)(0, 0, 0, 0);

    for (int i=0; i<16; i++)
    {
        for (int j=0; j<16; j++)
        {
            diff += read_imageui(src, sampler, (int2)(pos0.x + i, pos0.y + j)) -
                read_imageui(src, sampler, (int2)(pos.x + …
Run Code Online (Sandbox Code Playgroud)

optimization gpgpu opencl pyopencl

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

OpenCL矩阵乘法应该更快?

我正在尝试学习如何制作GPU优化的OpenCL kernells,我在本地存储器中使用方形图块作为矩阵乘法的例子.然而,与numpy.dot()(5 Gflops,它正在使用BLAS)相比,我获得了最好的情况只有~10倍的加速(~50 Gflops).

我发现他们的研究速度超过200倍(> 1000 Gflops). ftp://ftp.u-aizu.ac.jp/u-aizu/doc/Tech-Report/2012/2012-002.pdf 我不知道我做错了什么,或者只是因为我的GPU(nvidia GTX 275).或者,如果是因为一些pyOpenCl开销.但是我也确信将GPU的结果复制到RAM需要多长时间,它只是矩阵乘法时间的10%左右.

#define BLOCK_SIZE 22 
__kernel void matrixMul(
      __global float* Cij, 
      __global float* Aik, 
      __global float* Bkj, 
      __const int ni, 
      __const int nj,
      __const int nk
){
//   WARRNING : interchange of  i  and  j  dimension  lower the performance >2x on my nV GT275 GPU    
int gj = get_global_id(0);    int gi = get_global_id(1); 
int bj = get_group_id(0);     int bi = get_group_id(1);  // Block index
int …
Run Code Online (Sandbox Code Playgroud)

performance opencl matrix-multiplication pyopencl

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

如何在独立显卡 AMD GPU 上运行 Python 脚本?

我想做的事:

我有一个脚本,用于分解给定范围内的素数:

# Python program to display all the prime numbers within an interval

lower = 900
upper = 1000

print("Prime numbers between", lower, "and", upper, "are:")

for num in range(lower, upper + 1):
   # all prime numbers are greater than 1
   if num > 1:
       for i in range(2, num):
           if (num % i) == 0:
               break
       else:
           print(num)
Run Code Online (Sandbox Code Playgroud)

我想使用 GPU 而不是 CPU 来运行这样的脚本,这样会更快

问题:

我的英特尔 NUC NUC8i7HVK上没有 NVIDIA GPU,而是“独立 GPU”

在此输入图像描述

如果我运行此代码来检查我的 GPU 是什么:

import pyopencl as …
Run Code Online (Sandbox Code Playgroud)

python pyopengl pyopencl tensorflow pytorch

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

Opencl 在 colab 中未检测到 T4 硬件加速器

我在 colab 中使用笔记本,开始收到以下错误消息:

LogicError: clGetPlatformIDs failed: PLATFORM_NOT_FOUND_KHR
Run Code Online (Sandbox Code Playgroud)

我的代码使用PyRQA包,它使用opencl来执行计算。几周前它运行没有任何问题,但现在一直显示错误。

命令

!clinfo
Run Code Online (Sandbox Code Playgroud)

返回以下内容:

Number of platforms                               0
Run Code Online (Sandbox Code Playgroud)

看起来 opencl 没有检测到 T4 硬件加速,即使它是在运行时设置的。

opencl pyopencl google-colaboratory

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

对nvidia GPU上的计算单元和预期核心的混淆

我有一个nvidia GTX 750 Ti卡,它被宣传为具有640个CUDA核心.实际上,nvidia设置应用程序也报告了这一点.

我正在尝试使用此卡在Linux上进行OpenCL开发.现在,我已经从OpenCL环境(通过PyOpenCL,如果它有所作为)报告计算单元的数量是5.我的理解是nvidia设备上的一个计算单元映射到一个多处理器,我理解为32 SIMD单位(我假设是CUDA核心).

显然,5*32不是640(相当于预期的四分之一).

我是否遗漏了有关nvidia工作单位含义的内容?该卡还驱动图形输出,它将使用一些计算能力 - 是为图形使用保留的处理能力的一部分?(如果是的话,我可以改变吗?).

linux gpgpu nvidia opencl pyopencl

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

致命错误 C1083:无法打开包含文件:'CL/cl.h'

为了解决这个问题,我阅读了本网站提供的所有解决方案,但它仍然存在。当我在 windows 10 中的 cmd 中运行此命令时C:\pyopencl-2016.2.1>setup.py install,将显示此错误:

c:\pyopencl-2016.2.1\src\c_wrapper\clinfo_ext.h(10) : fatal error C1083: 

Cannot open include file: 'CL/cl.h': No such file or directory
error: command 'C:\\Users\\Neda\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\amd64\\cl.exe' failed with exit status 2
Run Code Online (Sandbox Code Playgroud)

此外,上面提到的路径中没有cl.exeCL/。我真的很感激你的关注。

编辑:我也在 cmd 中运行了这个命令,Command "pip install --global-option=build_ext --global-option="-DHAVE_GL=1" pyopencl问题是一样的:

c:\users\neda\appdata\local\temp\pip-build-ugbqq9\pyopencl\src\c_wrapper\clinfo_ext.h(10) : fatal error C1083: Cannot open include file: 'CL/cl.h': No such file or directory
error: command '

C:\\Users\\Neda\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\amd64\\cl.exe' failed with exit status 2

    ----------------------------------------
Command "c:\users\neda\appdata\local\enthought\canopy\user\python.exe …
Run Code Online (Sandbox Code Playgroud)

python-2.7 pyopencl

3
推荐指数
2
解决办法
8112
查看次数

local_work_size对性能及其原因的影响

大家好......
我是opencl的新手,并试图探索更多@它.

openCL程序中local_work_size的工作是什么以及它在性能方面的重要性.

我正在研究一些图像处理算法和我给我的openCL内核

size_t local_item_size = 1; 
size_t global_item_size = (int) (ceil((float)(D_can_width*D_can_height)/local_item_size))*local_item_size; // Process the entire lists
ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL,&global_item_size, &local_item_size, 0, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

当我改变时为同一个内核

 size_t local_item_size = 16;
Run Code Online (Sandbox Code Playgroud)

保持一切相同.

我的性能提高了4-5倍.

opencl pyopencl

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

OpenCL 的编译器警告

今天醒来突然发现

C:\Python27\lib\site-packages\pyopencl\__init__.py:61: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.
  "to see more.", CompilerWarning)
C:\Python27\lib\site-packages\pyopencl\cache.py:101: UserWarning: could not obtain cache lock--delete 'c:\users\User\appdata\local\temp\pyopencl-compiler-cache-v2-uiduser-py2.7.3.final.0\lock' if necessary
  % self.lock_file)
Run Code Online (Sandbox Code Playgroud)

当我运行任何类型的 PqOpenCL 代码时,例如:

import numpy
import pyopencl as cl
import pyopencl.array as clarray
from pyopencl.reduction import ReductionKernel

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
krnl = ReductionKernel(ctx, numpy.float32, neutral="0",
                       reduce_expr="a+b", map_expr="x[i]*y[i]",
                       arguments="__global float *x, __global float *y")
x = clarray.arange(queue, 400, dtype=numpy.float32)
y = clarray.arange(queue, 400, dtype=numpy.float32)
m = krnl(x, …
Run Code Online (Sandbox Code Playgroud)

python numpy opencl pyopencl

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

numpy 运行速度比 OpenCL 快吗?

我在 pyopencl 中尝试了一些基本示例,并注意到,无论我做什么,numpy 都比 pyopengl 运行得更快。我在 Intel i5 嵌入式 HD4400 上运行我的脚本。显然没有什么特别的,但是 numpy 的运行速度至少是 pyopengl 的两倍。我尝试的最后一个脚本:

import pyopencl as cl
from pyopencl import algorithm
import numpy as np
from time import time
from pyopencl.clrandom import rand
from pyopencl.array import to_device

if __name__ == '__main__':
    ctx = cl.create_some_context()
    queue = cl.CommandQueue(ctx)
    q = np.random.random_integers(-10**6,high=10**6, size=2**24)
    r = to_device(queue, q)
    begin = time()
    out, count, even = algorithm.copy_if(r, "ary[i] < 42", queue=queue)
    out.get()
    print("OpenCL takes {:9.6F} seconds".format(time() - begin))
    begin = time()
    b …
Run Code Online (Sandbox Code Playgroud)

python numpy pyopencl

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

错误:pyopencl:为特定设备创建上下文

我想在我的平台上为特定设备创建上下文.但是我收到了一个错误.

码:

import pyopencl as cl
platform = cl.get_platforms()
devices = platform[0].get_devices(cl.device_type.GPU)
ctx = cl.Context(devices[0])
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

Traceback (most recent call last):
  File "D:\Programming\Programs_OpenCL_Python\Matrix Multiplication\3\main3.py", line 16, in <module>
    ctx = cl.Context(devices[0])
AttributeError: 'Device' object has no attribute '__iter__'
Run Code Online (Sandbox Code Playgroud)

如果我使用以下程序编译并执行没有任何错误和警告:

ctx = cl.create_some_context()
Run Code Online (Sandbox Code Playgroud)

但是每次执行程序时我都必须手动选择设备类型.我可以设置以下环境变量

PYOPENCL_CTX='0'
Run Code Online (Sandbox Code Playgroud)

使用此功能,我将无法根据要求为不同的设备创建上下文.对于我创建的所有上下文,它将默认设置为设备0.

有人可以帮我解决这个问题.

谢谢

python opencl pyopencl

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

在PyCUDA上开始使用共享内存

我试图通过使用以下代码来了解共享内存:

import pycuda.driver as drv
import pycuda.tools
import pycuda.autoinit
import numpy
from pycuda.compiler import SourceModule

src='''
__global__ void reduce0(float *g_idata, float *g_odata) {
extern __shared__ float sdata[];
// each thread loads one element from global to shared mem
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;

sdata[tid] = g_idata[i];
__syncthreads();
// do reduction in shared mem
for(unsigned int s=1; s < blockDim.x; s *= 2) {
   if (tid % (2*s) == 0) {
      sdata[tid] += sdata[tid …
Run Code Online (Sandbox Code Playgroud)

python cuda gpgpu pycuda pyopencl

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

如何正确分配 double8 类型

我正在尝试分配一个 double8 类型,最终用于使用 pyopencl 的某些 AVX2 并行化。我正在编写代码以在两个向量 va 和 vb 之间有效地找到点积,并返回结果 vc。

代码如下:

# create context 
ctx = cl.create_some_context()
mf = cl.mem_flags

# define vectors to dot product 
va=np.array([1, 2, 3, 4, 5, 6, 7, 8],dtype=np.float32)
vb=np.array([1, 2, 3, 4, 5, 6, 7, 8],dtype=np.float32)

# create memory buffers for input vectors and output buffer
va_buf=cl.Buffer(ctx,mf.READ_ONLY|mf.COPY_HOST_PTR,hostbuf=va)
vb_buf=cl.Buffer(ctx,mf.READ_ONLY|mf.COPY_HOST_PTR,hostbuf=vb)
vc_buf=cl.Buffer(ctx,mf.WRITE_ONLY,vb.nbytes)

# define my kernel / C function that will perform dot product 
kernel="""
__kernel void adder(const __global float* va,
                const __global float* vb, …
Run Code Online (Sandbox Code Playgroud)

c python types opencl pyopencl

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