我工作在一张的OpenCL代码用于专门基质功能:对于Dx1向量v中,两个DxD矩阵A和B以及恒定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) 在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)
如何修复它?
在尝试从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包含目录的路径.可能不是一个好的解决方案.但这很容易解决.
这是一个简单的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中实现RSA,但我想在GPU上运行密集计算.我已经成功实现了我自己在PyOpenCL中运行的模数表达式,但我最大限度地使用了六位整数来表示基数和指数.比这更大的数字和GPU崩溃.
我需要在numpy中创建一个非常大的整数值数组,并将它们发送到PyOpenCL代码,并使用GPU上的大整数执行乘法和模运算.
以前有人做过类似的事吗?谷歌搜索cuda和bigint没有给出任何好结果.:(
在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_ONLY和WRITE_ONLY标志就是为了要帮助调试和捕获错误?
PyOpenCL有两种创建OpenCL缓冲区的方法:
pyopencl.Buffer 采用numpy数组并将其转换为缓冲区.
pyopencl.array.Array获取一个numpy数组并将其转换为PyOpenCL数组 - 一个可以像numpy数组一样编辑的对象,但在调用.data它时提供缓冲区.
是否存在选择其中一个的性能/功能原因?或者我应该只选择使我的代码更具可读性的那个?
今天我偶然发现了stackoverflow中的帖子(另见这里):
我们正在开发opencl4py,更高级别的绑定.这个项目使用CFFI,所以它适用于Pypy.
我们遇到的pyopencl的主要问题是'import pyopencl'执行OpenCL初始化并在NVIDIA驱动程序的情况下获取整个虚拟内存,防止正确分叉并有效禁用多处理(是的,我们声称使用pyopencl禁用多处理至少使用NVIDIA ).opencl4py使用惰性OpenCL初始化,解决这个"导入地狱".
后来,它获得了一些很好的功能,如超级简单的二进制程序缓存等.不幸的是,文档有点简短.了解其工作原理的最佳方法是进行测试.
由于还有pyOpenCL,我想知道这两个包之间的区别是什么.有谁知道我在哪里可以找到关于这两个包的专业人士和骗子的概述?
编辑:包括benshope的评论,因为我也会感兴趣:"禁用[s]多处理"是什么意思?比如,它不能同时在几个设备上运行内核?
将多个矩阵乘法计算与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) 我的代码需要很长时间才能运行,因此我一直在研究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)