在我的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)
您有什么推荐的吗?
如何在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) 我正在尝试学习如何制作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) 我想做的事:
我有一个脚本,用于分解给定范围内的素数:
# 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) 我在 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 硬件加速,即使它是在运行时设置的。
我有一个nvidia GTX 750 Ti卡,它被宣传为具有640个CUDA核心.实际上,nvidia设置应用程序也报告了这一点.
我正在尝试使用此卡在Linux上进行OpenCL开发.现在,我已经从OpenCL环境(通过PyOpenCL,如果它有所作为)报告计算单元的数量是5.我的理解是nvidia设备上的一个计算单元映射到一个多处理器,我理解为32 SIMD单位(我假设是CUDA核心).
显然,5*32不是640(相当于预期的四分之一).
我是否遗漏了有关nvidia工作单位含义的内容?该卡还驱动图形输出,它将使用一些计算能力 - 是为图形使用保留的处理能力的一部分?(如果是的话,我可以改变吗?).
为了解决这个问题,我阅读了本网站提供的所有解决方案,但它仍然存在。当我在 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.exe和CL/。我真的很感激你的关注。
编辑:我也在 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) 大家好......
我是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倍.
今天醒来突然发现
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) 我在 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) 我想在我的平台上为特定设备创建上下文.但是我收到了一个错误.
码:
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.
有人可以帮我解决这个问题.
谢谢
我试图通过使用以下代码来了解共享内存:
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) 我正在尝试分配一个 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) pyopencl ×13
opencl ×9
python ×7
gpgpu ×3
numpy ×2
c ×1
cuda ×1
linux ×1
nvidia ×1
optimization ×1
performance ×1
pycuda ×1
pyopengl ×1
python-2.7 ×1
pytorch ×1
tensorflow ×1
types ×1