私は理解していないmemcpyに問題があります。私はスレッド上でmemcpyを使用し、メインから実行するときに比べて3-4倍遅くなります。どちらの場合も、私は2つのスレッドがただ待っていて、もう1つはmemcpyを呼び出しています。あなたはこれについて何か可能な説明をしてくれますか?私はハイパースレッディング付きの4コアIntelマシンを使用しています。スレッドで呼び出されたときにmemcpyが遅い
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <string.h>
#include <pthread.h>
#include <algorithm>
#define MILLION 1000000
#define START_TIMER(timer) { \
gettimeofday(&(timer), NULL); \
}
#define STOP_TIMER(timer) { \
gettimeofday(&(timer), NULL); \
}
#define TIME_DIFF(timer1, timer2, total) { \
long long sec_diff = 0; \
long long usec_diff = 0; \
sec_diff = (timer2).tv_sec - (timer1).tv_sec; \
usec_diff = (timer2).tv_usec - (timer1).tv_usec; \
(total)+= (sec_diff * MILLION) + usec_diff; \
}
void copy(){
struct timeval start, stop;
long long total=0;
char buff[1024*1024];
for(int i =0;i<100;i++){
char* temp = new char[1024*1024];
START_TIMER(start);
std::copy(buff,buff+1024*1024,temp);
STOP_TIMER(stop);
TIME_DIFF(start,stop,total);
delete temp;
}
printf("%lld\n",total/100);
}
void* mem(void* args){
copy();
pthread_exit(NULL);
}
void * nothing(void *args){
pthread_exit(NULL);
}
pthread_t thread;
int main(int argc,char* argv[]){
if(atoi(argv[1])==0){
pthread_create(&thread,NULL,nothing,NULL);
pthread_join(thread,NULL);
copy();
}
else{
pthread_create(&thread,NULL,mem,NULL);
pthread_join(thread,NULL);
}
}
ありがとうございます。私はそれがあまりにも愚かでないことを願っています。
あなたの 'i'ループの前に' buff'を初期化するとどうなりますか? – 1201ProgramAlarm
メインから、そしてスレッドからコピー機能を呼び出すコードを共有してください。問題を再現しようとすることができるように。 – Sush
main()の中のcopy()をスレッド作成の上に移動した場合、つまりメインスレッドのコピーを先に実行するとどうなりますか? – ThingyWotsit