function [D] = distChiSq( W, X )
%%% find the Chi2Dist distance between each weight vector and X
% W is nxd
m = size(W,1); n = size(X,1);
k = size(W,2);
mOnes = ones(1,m); D = zeros(m,n);
for i=1:n
Xi = X(i,:); XiRep = Xi( mOnes, : );
s = XiRep + W; /************/
d = XiRep - W; /************/
D(:,i) = sum( d.^2 ./ (s+eps), 2 ); /************/
end
D = D/2;
Run Code Online (Sandbox Code Playgroud)
这是权重矩阵和数据之间的Chi2距离计算的一部分.标记的行是所有代码中消耗最多的行.有没有办法在MATLAB中更快地完成它?
如果数据是nxm s = nxm, d = …
我想逐渐计算整个内核执行的线程执行次数.是否有本地计数器或有没有其他方法可以做到这一点?我知道保留一个全局变量并且每个线程的增量都不会起作用,因为全局内存中的变量不保证线程的同步访问.
我在代码中的几个地方执行以下操作;
cv::Mat cv_proc_image = ...
IplImage ipl_img = cv_proc_image;
cvSmooth(&ipl_img, &ipl_img, smooth_type, smooth_param1);
cv_proc_image = cv::cvarrToMat(&ipl_img);
Run Code Online (Sandbox Code Playgroud)
在观察到此操作的变化后,我观察到内存膨胀.你认为,我应该在最后一次分配后释放IplImages分配的内存吗?
这是我的内核调用代码
inline void find_min_max(thrust::device_vector<Npp8u> dev_vec, Npp8u *min, Npp8u *max){
thrust::pair<thrust::device_vector<Npp8u>::iterator,thrust::device_vector<Npp8u>::iterator> tuple;
tuple = thrust::minmax_element(dev_vec.begin(),dev_vec.end());
*min = *(tuple.first);
*max = *tuple.second;
}
Run Code Online (Sandbox Code Playgroud)
我还使用map-reduce范例和简单的CPU代码,用我的原始CUDA内核实现相同的算法.作为测量的结果,我看到推力是最慢的.
为简洁起见,我使用事件来测量原始CUDA和推力代码.如果事件适用于推力基准测试,我很确定我能正确测量执行时间.
这是测量部分;
....
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
thrust::device_vector<Npp8u> image_dev(imageHost, imageHost+N);
// Device vector allocation
find_min_max(image_dev,&min,&max);
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
float elapsedTime1;
cudaEventElapsedTime(&elapsedTime1, start, stop);
cudaEventDestroy(start);
cudaEventDestroy(stop);
totalTime1 = elapsedTime1/1000
....
Run Code Online (Sandbox Code Playgroud)
我真正的问题是,除了推力中的简单minmax_element函数之外,是否还有可能采用更好的方法?
我的机器规格:这是华硕k55v笔记本电脑与GeForce 635M和i7处理器.
可能重复:
如何查找sizeof(指向数组的指针)
我正在使用以下代码创建一个数组
float *A;
A = (float *) malloc(100*sizeof(float));
float *B;
B = (float *) malloc(100*sizeof(float));
Run Code Online (Sandbox Code Playgroud)
但在这些之后,当我按下面的方式键入A和B的大小时,我得到2,因为我希望看到100.
sizeof(A)/sizeof(float)
Run Code Online (Sandbox Code Playgroud) c++ ×2
cuda ×2
matlab ×2
arrays ×1
memory-leaks ×1
opencv ×1
optimization ×1
performance ×1
sizeof ×1
thrust ×1