如何解决分叉线程的成本:如何确定最小向量大小以证明多线程的合理性
|| 我正在尝试计算许多矢量对的点积。每个点积可以使用多个线程,但是由于数据依赖性,不应同时执行两个或多个点积。这里可能证明多线程合理的最小向量大小是多少?我意识到没有人能够给我确切的答案,所以我只是在寻找粗略的估计。 为问题添加更多的上下文:我的程序需要计算很多点积,但是一次只能完成一个点积。double serial_dot_product(const double* x,const double* y,size_t length);
我想重写点积以使其成为多线程。但是,如果length
太小,则使用多个线程不会获得任何收益。
编辑。谢谢各位的意见。看来答案取决于太多因素-编译器,CPU,内存,线程库等。
解决方法
唯一真正知道的方法是进行尝试(请记住,结果可能会因您所运行的硬件而异)。您可以编写一个性能分析例程来自动化测试,并且(如果您认为这样做值得)甚至可以在程序启动时短暂运行该例程,以找出最佳性能值。当前的硬件。
#include <sys/time.h>
unsigned long long GetCurrentTime()
{
struct timeval tv;
gettimeofday(&tv,NULL);
return (((unsigned long long)tv.tv_sec)*1000000) + ((unsigned long long)tv.tv_usec);}
}
void FindOptimumMethod()
{
unsigned long long lowestTime = ((unsigned long long)-1);
int bestVectorLength = 0;
int bestNumThreads = 0;
for (int vectorLen=1; vectorLen<100000; vectorLen++)
{
for (int numThreads=1; numThreads<16; numThreads++)
{
unsigned long long startTime = GetCurrentTime();
DoTheCalculation(numThreads,vectorLen);
unsigned long long elapsedTime = GetCurrentTime()-startTime;
if (elapsedTime < lowestTime)
{
lowestTime = elapsedTime;
bestVectorLength = vectorLen;
bestNumThreads = numThreads;
}
}
}
printf(\"The fastest way is %i threads using a vector length of %i\\n\",bestNumThreads,bestVectorLength);
}
, 我的经验是线程非常繁重。编写它,以便您可以将可变大小的工作块传递给线程。然后,您可以根据需要进行调整。
我还将考虑使用可以使用线程或GPU的库。我敢打赌,GPU将非常擅长于生产点产品。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。