gpt4 book ai didi

Matlab CUDA基础实验

转载 作者:太空宇宙 更新时间:2023-11-03 20:21:43 25 4
gpt4 key购买 nike

(正确且有指导意义的回答,见下文)

我开始用 matlab 和 gpu (nvidia gtx660) 做实验。

现在,我编写了这个简单的蒙特卡洛算法来计算 PI。以下是CPU版本:

function pig = mc1vecnocuda(n)
countr=0;
A=rand(n,2);
for i=1:n

if norm(A(i,:))<1
countr=countr+1;
end
end
pig=(countr/n)*4;
end

将 100000 个点“扔”到单位圆中,在 CPU 上执行这需要很少的时间:

   >> tic; mc1vecnocuda(100000);toc;

Elapsed time is 0.092473 seconds.

相反,看看算法的 gpu 化版本会发生什么:

   function pig = mc1veccuda(n)
countr=0;
gpucountr=gpuArray(countr);
A=gpuArray.rand(n,2);
parfor (i=1:n,1024)
if norm(A(i,:))<1
gpucountr=gpucountr+1;
end
end

pig=(gpucountr/n)*4;
end

现在,这需要很长时间才能执行:

>> tic; mc1veccuda(100000);toc;
Elapsed time is 21.137954 seconds.

我不明白为什么。我对 1024 个工作人员使用了 parfor 循环,因为用 gpuDevice 查询我的 nvidia 卡,1024 是 gtx660 上允许的最大并发线程数。

有人可以帮助我吗?谢谢。

编辑:这是避免 IF 的更新版本:

function pig = mc2veccuda(n)
countr=0;
gpucountr=gpuArray(countr);
A=gpuArray.rand(n,2);
parfor (i=1:n,1024)

gpucountr = gpucountr+nnz(norm(A(i,:))<1);

end

pig=(gpucountr/n)*4;
end

这是按照 Bichoy 的指南编写的代码(the正确实现结果的代码):

function pig = mc3veccuda(n)
countr=0;
gpucountr=gpuArray(countr);
A=gpuArray.rand(n,2);
Asq = A.^2;
Asqsum_big_column = Asq(:,1)+Asq(:,2);
Anorms=Asqsum_big_column.^(1/2);
gpucountr=gpucountr+nnz(Anorms<1);

pig=(gpucountr/n)*4;
end

请注意 n=1000 万时的执行时间:

>> tic; mc3veccuda(10000000); toc;
Elapsed time is 0.131348 seconds.
>> tic; mc1vecnocuda(10000000); toc;
Elapsed time is 8.108907 seconds.

我没有测试我的原始 cuda 版本 (for/parfor),因为它的执行需要数小时且 n=10000000。

伟大的双鱼! ;)

最佳答案

我想问题出在 parfor 上!

parfor 应该在 MATLAB worker 上运行,那是你的主机而不是 GPU!我想实际发生的事情是您在主机上(而不是在 GPU 上)启动了 1024 个线程,并且每个线程都在尝试调用 GPU。这会导致您的代码花费大量时间。

尝试重新编写代码以使用矩阵和数组运算,而不是 for 循环!这将显示一些加速。另外,请记住,您应该在 GPU 中进行更多计算,否则内存传输将支配您的代码。

代码:

这是在包含了几个人的所有更正和建议之后的最终代码:

function pig = mc2veccuda(n)
A=gpuArray.rand(n,2); % An nx2 random matrix
Asq = A.^2; % Get the square value of each element
Anormsq = Asq(:,1)+Asq(:,2); % Get the norm squared of each point
gpucountr = nnz(Anorm<1); % Check the number of elements < 1
pig=(gpucountr/n)*4;

关于Matlab CUDA基础实验,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15988669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com