Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyopencl排队复制对于大型缓冲区来说太慢_Python_Arrays_Numpy_Pyopencl - Fatal编程技术网

Python Pyopencl排队复制对于大型缓冲区来说太慢

Python Pyopencl排队复制对于大型缓冲区来说太慢,python,arrays,numpy,pyopencl,Python,Arrays,Numpy,Pyopencl,假设我正在执行这个简单的内核: __kernel void sine(__global float *res){ int i = get_global_id(0); res[i] = sin((float)i); } 所以我基本上是在计算样本数的正弦值。我有一个float32的numpy空数组,形状为n,还有一个WRITE\u缓冲区,大小与numpy数组相同 对于n=10000000,使用输入缓冲区调用具有n全局大小的内核大约需要0.2ms,现在,使用Equeue Copy将数

假设我正在执行这个简单的内核:

__kernel void sine(__global float *res){
    int i = get_global_id(0);
    res[i] = sin((float)i);
}
所以我基本上是在计算样本数的正弦值。我有一个float32的numpy空数组,形状为
n
,还有一个
WRITE\u
缓冲区,大小与numpy数组相同

对于
n=10000000
,使用输入缓冲区调用具有
n
全局大小的内核大约需要0.2ms,现在,使用
Equeue Copy
将数据从缓冲区复制到空数组大约需要100ms


我的问题是,这次是正常的吗?还有什么可以改进的吗?

我还没有使用过Pyopencl,但有使用opencl的经验。很难直接回答这个问题,因为这取决于您使用的硬件。如果我没有弄错的话,您正试图将10000000 float32的数组从运行内核的设备复制到主机设备。这大约是38MB的副本(假设float32是4字节)。因此,根据传输这些数据量的速度,可能会有一定的延迟。此外,最好能说明您是如何测量时间的,也许这可以提供更多的见解。@MartinImre我通过测量主机代码中每个步骤的执行来测量时间,所以内核执行是通过测量调用函数来测量的,复制是通过测量ClEqueueCopy函数来测量的。我认为有分析功能,但我还不知道如何使用它。至于硬件,我有一个AMD HD5450,这是相当旧的。我问这个问题只是想看看这一次是否有意义,或者是我做错了什么需要改进的地方。对不起,我没有太多经验。你是如何衡量这些时间的?你能发布一个完整的代码示例吗?@MartinImre主机代码是在基于节点的系统中实现的,因此我不需要编写任何主机代码。但我可以告诉你基于节点的系统是如何做到这一点的。只需在运算符之前和之后使用getCurrentTime(),然后减去它们即可。要在OpenCL中测量时间,需要使用OpenCL事件来确保单个步骤完成。如果你这么做了,你仍然会看到很长的阅读时间,那么,据我所知,这真的需要很长时间。