1
我想正常化數組,如下所示。優化CUDA內核有關正常化的陣列
- 挑選數組的前兩個元素,找到總和,並使用該總和進行分割。
- 對其餘元素做同樣的事情。
它工作正常。但是,當我增加陣列的尺寸時,時間複雜度就出現了。我已經在下面給出了我的代碼。
import pycuda.driver as drv
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy as np
mod=SourceModule("""
__global__ void addition(float* a,float* c,float* d)
{
int i=blockIdx.y*blockDim.y+threadIdx.y;
for (i=0;i<=4;++i)
{
int sum=0.0;
for (int j=0;j<=1;++j)
{
sum+=a[2*i+j];
}
c[i]=sum;
}
for (i=0;i<=4;i++)
{
for (int j=0;j<=1;++j)
{
d[2*i+j]=a[2*i+j]/c[i];
}
}
}
""")
addition=mod.get_function("addition")
a=np.array([1,2,3,1,2,3,2,1]).astype(np.float32)
c=np.zeros_like(a)
d=np.zeros_like(a)
addition(drv.In(a),drv.InOut(c),drv.InOut(d),block=(1,8,1))
print d
d的結果是[0.33333334 0.66666669 0.75 0.25 0.40000001 0.60000002 0.666666669 0.33333334]。任何人都可以提出一些想法來優化代碼?
爲什麼你打算計算'int i = blockIdx.y * blockDim.y + threadIdx.y;'如果你馬上要丟棄它? –
@PaulR:我是PyCuda的新手。啓動這樣的'我'是否有錯? –
爲什麼要問如何優化什麼是有效的計算少量FLOP的完全串行代碼?另外,你爲什麼要進行整數初始求和呢?這是故意的嗎? – talonmies