| /* |
| m5threads, a pthread library for the M5 simulator |
| Copyright (C) 2009, Stanford University |
| |
| This library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| This library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with this library; if not, write to the Free Software |
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| */ |
| |
| |
| |
| #include <assert.h> |
| #include <pthread.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include <sys/time.h> |
| |
| // without volatile, simulator test works even if __thread support is broken |
| __thread volatile int local = 7; |
| |
| volatile long long int jjjs = 0; |
| |
| static const int count = 1024; |
| |
| void* run (void* arg) |
| { |
| long long int id = (long long int)arg; |
| int i; |
| printf("&local[%d]=%p\n", id, &local); |
| local += id; |
| for (i = 0; i < count; i++) { |
| local++; |
| } |
| |
| //Some calculations to delay last read |
| long long int jjj = 0; |
| for (i = 0; i < 10000; i++) { |
| jjj = 2*jjj +4 -i/5 + local; |
| } |
| jjjs = jjj; |
| |
| //assert(local == count +id); |
| return (void*)local; |
| } |
| |
| int main (int argc, char** argv) |
| { |
| if (argc != 2) { |
| printf("usage: %s <thread_count>\n", argv[0]); |
| exit(1); |
| } |
| int thread_count = atoi(argv[1]); |
| |
| printf("Starting %d threads...\n", thread_count); |
| |
| //struct timeval startTime; |
| //int startResult = gettimeofday(&startTime, NULL); |
| //assert(startResult == 0); |
| int i; |
| pthread_t* threads = (pthread_t*)calloc(thread_count, sizeof(pthread_t)); |
| assert(threads != NULL); |
| for (i = 1 ; i < thread_count; i++) { |
| int createResult = pthread_create(&threads[i], |
| NULL, |
| run, |
| (void*)i); |
| assert(createResult == 0); |
| } |
| |
| long long int local = (long long int)run((void*)0); |
| printf("local[0] = %d\n", local); |
| |
| for (i = 1 ; i < thread_count; i++) { |
| int joinResult = pthread_join(threads[i], |
| (void**)&local); |
| assert(joinResult == 0); |
| printf("local[%d] = %d\n", i, local); |
| } |
| |
| /*struct timeval endTime; |
| int endResult = gettimeofday(&endTime, NULL); |
| assert(endResult == 0); |
| |
| long startMillis = (((long)startTime.tv_sec)*1000) + (((long)startTime.tv_usec)/1000); |
| long endMillis = (((long)endTime.tv_sec)*1000) + (((long)endTime.tv_usec)/1000); |
| */ |
| /*printf("End Time (s) = %d\n", (int)endTime.tv_sec); |
| printf("Start Time (s) = %d\n", (int)startTime.tv_sec); |
| printf("Time (s) = %d\n", (int)(endTime.tv_sec-startTime.tv_sec)); |
| printf("\n"); |
| |
| printf("End Time (us) = %d\n", (int)endTime.tv_usec); |
| printf("Start Time (us) = %d\n", (int)startTime.tv_usec); |
| printf("Time (us) = %d\n", (int)(endTime.tv_usec-startTime.tv_usec)); |
| printf("\n"); |
| |
| printf("End Time (ms) = %d\n", (int)endMillis); |
| printf("Start Time (ms) = %d\n", (int)startMillis); |
| printf("Time (ms) = %d\n", (int)(endMillis-startMillis)); |
| printf("\n");*/ |
| |
| /*double difference=(double)(endTime.tv_sec-startTime.tv_sec)+(double)(endTime.tv_usec-startTime.tv_usec)*1e-6; |
| printf("Time (s) = %f\n", difference); |
| printf("\n");*/ |
| return 0; |
| } |