2013-11-02 1 views
2

pyopencl을 사용하여 GPU를 사용하여 계산 속도를 높이고 다음 문제로 신비화되었습니다.for 루프에서 간단한 곱셈을 사용하여 pyopencl의 할당 오류

임 다음 코드

import numpy as np 
import pyopencl as cl 
import pyopencl.array as cl_array 
from pyopencl.elementwise import ElementwiseKernel 

ctx = cl.create_some_context(0) 
queue = cl.CommandQueue(ctx) 

multiply = ElementwiseKernel(ctx, 
      "float *x, float *y, float *z", 
      "z[i] = x[i] * y[i]", 
      "multiplication") 

x = cl_array.arange(queue, 1000000, dtype=np.complex64) 
y = cl_array.arange(queue, 1000000, dtype=np.complex64) 
z = cl_array.empty_like(x) 

for n in range(10000): 
    z = x*y 
    multiply(x.real, y.real, z.real) 
    multiply(x, y, z) 

을 사용하여 for 루프에 두 개의 배열의 간단한 곱셈을하고 마지막 세 줄의 과정, 즉 같은 일 곱셈을한다. 그러나 처음 두 옵션은 다음과 같은 오류가 발생합니다 (I 물론 다른 두에서 주석) : 처음 두 옵션은 할당 오류로 실행하는 이유는 단지 잃었어요

pyopencl.MemoryError: clEnqueueNDRangeKernel failed: mem object allocation failure 

.

참고 :

GPU : [0] pyopencl.Device '카보 베르데'를 0x2a76d90 나는 복잡한 유형이 제대로 처리되지 않는다는 것을 알고

>>> pyopencl.VERSION 
(2013, 1) 

에서 'AMD가 병렬 처리를 가속'에 있지만, np.float32로 변경하면 같은 문제가 발생합니다.

답변

1

나는 프로그램을 단순화하고 컴퓨터에서 작동하는 방식으로 한 번 실행했습니다. 여기에 나를 위해 일한 버전은 다음과 같습니다

import numpy as np 
import pyopencl as cl 
import pyopencl.array as cl_array 
from pyopencl.elementwise import ElementwiseKernel 

ctx = cl.create_some_context(0) 
queue = cl.CommandQueue(ctx) 

multiply = ElementwiseKernel(ctx, 
      "float *x, float *y, float *z", 
      "z[i] = x[i] * y[i]", 
      "multiplication") 

x = cl_array.arange(queue, 1000000, dtype=np.float32) 
y = cl_array.arange(queue, 1000000, dtype=np.float32) 
z = cl_array.empty_like(x) 

for i in range(10000): 
    multiply(x, y, z) 

이 프로그램은 np.float32 버퍼 커널을 실행합니다. 문제는 np.complex64 유형 또는 .real 30000 번을 호출 할 때 발생하며 매번 새로운 버퍼가 생성 될 수 있습니다. 또한 버퍼가 GPU에 비해 ​​너무 큽니다. 아래로 그 크기를 부딪 치는 시도하십시오.

당신이하고자하는 것이 정확히 무엇인지 모르겠지만, 표준 PyOpenCL으로 작업 할 때까지 ElementWise를 피하는 것이 좋습니다. ElementWise는 PyOpenCL의 진정한 본질을 혼란스럽게 할 수있는 구문 론적 설탕 일뿐입니다.

ElementWise없이 문제를 해결하려고하면 데이터가 항상있는 위치, 대기열을 관리하는 방법, 호스트간에 메모리를 복사하는 시점을 이해하는 데 도움이됩니다.

관련 문제