比如我有兩個陣列A和B,每個陣列內有1000萬個不同的數,資料型別為double
我想做A1*B1、A2*B2。。。。計算1000萬次
有什么計算速度較快的演算法嗎?
謝謝!
uj5u.com熱心網友回復:
可以考慮把資料分段 多執行緒運算, 每個執行緒運算一段uj5u.com熱心網友回復:
并行計算。。。。。。。。。。。。。。。。uj5u.com熱心網友回復:
可以考慮把資料分段 多執行緒運算, 每個執行緒運算一段,好麻煩uj5u.com熱心網友回復:
除了多執行緒,還可以考慮SIMD,支持的話可以用AVX指令,下面是多執行緒的#include <Windows.h>
#include <malloc.h>
typedef struct _MyParameter
{
double *A, *B, *C;
int start, length;
}MyParameter, *PMyParameter;
DWORD multiply_thread(PVOID pv)
{
PMyParameter p = (PMyParameter)pv;
for (int i = p->start; i < p->start + p->length; ++i)
{
p->C[i] = p->A[i] * p->B[i];
}
return 0;
}
void multiply(double *A, double *B, double *C, int length)
{
SYSTEM_INFO system_info;
GetSystemInfo(&system_info);
//執行緒數為邏輯CPU數目2倍
int numberOfThreads = system_info.dwNumberOfProcessors * 2;
//執行緒句柄陣列
PHANDLE handles = (PHANDLE)malloc(sizeof(HANDLE) * numberOfThreads);
if (handles == NULL)
{
return;
}
//引數陣列
PMyParameter parameters = (PMyParameter)malloc(sizeof(MyParameter) * numberOfThreads);
if (parameters == NULL)
{
return;
}
//每執行緒計算長度
int lengthPerThread = length / numberOfThreads;
MyParameter parameter = { A,B,C,0,lengthPerThread };
//多執行緒計算
for (int i = 0; i < numberOfThreads; ++i)
{
parameters[i] = parameter;
parameters[i].start = i * lengthPerThread;
handles[i] = CreateThread(NULL, 0, multiply_thread, parameters + i, NULL, NULL);
}
for (int i = length / numberOfThreads * numberOfThreads; i < length; ++i)
{
C[i] = A[i] * B[i];
}
WaitForMultipleObjects(numberOfThreads, handles, TRUE, INFINITE);
free(handles);
free(parameters);
}
uj5u.com熱心網友回復:
for (int i = length / numberOfThreads * numberOfThreads; i < length; ++i){
C[i] = A[i] * B[i];
}
length / numberOfThreads * numberOfThreads
這里是筆誤么?
uj5u.com熱心網友回復:
並行計算是最好的方法。uj5u.com熱心網友回復:
分段,分段數為CPU核心數的1~2倍,這樣效率比較高轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/37060.html
標籤:基礎類
上一篇:WinSock的recv函式
