minor optimizations
This commit is contained in:
parent
df40d33913
commit
0d74873fa9
4 changed files with 58 additions and 17 deletions
|
@ -21,7 +21,6 @@
|
|||
#define __ARCH_SVM_H__
|
||||
|
||||
#include <metalsvm/stddef.h>
|
||||
#include <asm/processor.h>
|
||||
#ifdef CONFIG_ROCKCREEK
|
||||
#include <asm/RCCE_lib.h>
|
||||
#endif
|
||||
|
@ -69,22 +68,32 @@ int svm_access_request(size_t addr);
|
|||
*/
|
||||
int svm_emit_page(size_t addr, int ue);
|
||||
|
||||
/* @brief invalidate the cache entries for all SVM regions
|
||||
*/
|
||||
static inline void svm_invalidate(void)
|
||||
{
|
||||
asm volatile ( ".byte 0x0f; .byte 0x0a;\n" ); // CL1FLUSHMB
|
||||
}
|
||||
|
||||
/* *brief flushs the cache for all SVM regions
|
||||
*/
|
||||
#ifdef CONFIG_ROCKCREEK
|
||||
#ifndef SVM_WB
|
||||
static inline void svm_flush(void)
|
||||
{
|
||||
#ifdef CONFIG_ROCKCREEK
|
||||
// need to write to another line to make sure the write combine buffer gets flushed
|
||||
*(int *)RCCE_fool_write_combine_buffer = 1;
|
||||
#endif
|
||||
#ifdef SVM_WB
|
||||
flush_cache();
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
void svm_flush(void);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* @brief dumps the some performance counters (e.g. numbers of page migrations)
|
||||
*
|
||||
* @retrun
|
||||
* - 0 on success
|
||||
*/
|
||||
int svm_statistics(void);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include <metalsvm/page.h>
|
||||
#include <metalsvm/errno.h>
|
||||
#include <asm/irqflags.h>
|
||||
#include <asm/processor.h>
|
||||
#ifdef CONFIG_ROCKCREEK
|
||||
#include <asm/RCCE.h>
|
||||
#include <asm/RCCE_lib.h>
|
||||
|
@ -229,21 +230,42 @@ int svm_emit_page(size_t phyaddr, int ue)
|
|||
|
||||
forward[remote_rank]++;
|
||||
} else {
|
||||
size_t viraddr = phys2virt[(phyaddr - shmbegin) >> PAGE_SHIFT];
|
||||
size_t viraddr;
|
||||
|
||||
svm_flush();
|
||||
change_page_permissions(viraddr, viraddr+PAGE_SIZE, VMA_NOACCESS|VMA_READ|VMA_CACHEABLE);
|
||||
|
||||
page_owner[pageid] = ue;
|
||||
// need to write to another line to make sure the write combine buffer gets flushed
|
||||
*(int *)RCCE_fool_write_combine_buffer = 1;
|
||||
|
||||
emit[ue]++;
|
||||
viraddr = phys2virt[(phyaddr - shmbegin) >> PAGE_SHIFT];
|
||||
change_page_permissions(viraddr, viraddr+PAGE_SIZE, VMA_NOACCESS|VMA_READ|VMA_CACHEABLE);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef SVM_WB
|
||||
void svm_flush(void)
|
||||
{
|
||||
int z, tmp;
|
||||
|
||||
// need to write to another line to make sure the write combine buffer gets flushed
|
||||
*(int *)RCCE_fool_write_combine_buffer = 1;
|
||||
flush_cache();
|
||||
|
||||
#if 0
|
||||
// try to flush L2 cache
|
||||
z = Z_PID(RC_COREID[my_ue]);
|
||||
tmp=ReadConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1));
|
||||
tmp &= ~(1 << GLCFG_XFLSHNN_BIT);
|
||||
SetConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1), tmp);
|
||||
|
||||
while(!(ReadConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1)) & (1 << GLCFG_XFLSHNN_BIT))) {
|
||||
NOP8;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
int svm_statistics(void)
|
||||
{
|
||||
uint32_t i;
|
||||
|
|
|
@ -164,9 +164,18 @@ int icc_init(void)
|
|||
// reset INTR/LINT0 flag
|
||||
z = Z_PID(RC_COREID[my_ue]);
|
||||
tmp=ReadConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1));
|
||||
tmp &= ~2;
|
||||
tmp &= ~(1 << GLCFG_XINTR_BIT);
|
||||
SetConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1), tmp);
|
||||
|
||||
#if 0
|
||||
// disable L2 cache
|
||||
z = Z_PID(RC_COREID[my_ue]);
|
||||
tmp=ReadConfigReg(CRB_OWN + (z==0 ? L2CFG0 : L2CFG1));
|
||||
tmp |= (1 << L2CFG_WAYDISABLE_BIT);
|
||||
SetConfigReg(CRB_OWN + (z==0 ? L2CFG0 : L2CFG1), tmp);
|
||||
kprintf("set L2CFG to 0x%x\n", (uint32_t) tmp);
|
||||
#endif
|
||||
|
||||
// set interrupt handler (INTR/LINT0)
|
||||
irq_install_handler(124, intr_handler);
|
||||
|
||||
|
|
|
@ -131,7 +131,7 @@ static int svm_test(void *arg)
|
|||
my_ue = RCCE_ue();
|
||||
num_ues = RCCE_num_ues();
|
||||
|
||||
#if 1
|
||||
#if 0
|
||||
if (!my_ue) {
|
||||
// allocate and initialize SVM region
|
||||
A[0] = (int*) kmalloc(3*N*N*sizeof(int));
|
||||
|
@ -192,6 +192,7 @@ static int svm_test(void *arg)
|
|||
|
||||
svm_flush();
|
||||
|
||||
RCCE_barrier(&RCCE_COMM_WORLD);
|
||||
kputs("Start parallel calculation...\n");
|
||||
|
||||
start = rdtsc();
|
||||
|
@ -399,14 +400,14 @@ int test_init(void)
|
|||
// create_kernel_task(NULL,client_task,NULL);
|
||||
#endif
|
||||
|
||||
create_kernel_task(NULL, foo, "Hello from foo1");
|
||||
create_kernel_task(NULL, join_test, NULL);
|
||||
//create_kernel_task(NULL, foo, "Hello from foo1");
|
||||
//create_kernel_task(NULL, join_test, NULL);
|
||||
//create_kernel_task(NULL, producer, NULL);
|
||||
//create_kernel_task(NULL, consumer, NULL);
|
||||
//create_kernel_task(NULL, mail_ping, NULL);
|
||||
//create_kernel_task(NULL, svm_test, NULL);
|
||||
create_kernel_task(NULL, svm_test, NULL);
|
||||
//create_user_task(NULL, "/bin/hello", argv);
|
||||
create_user_task(NULL, "/bin/tests", argv);
|
||||
//create_user_task(NULL, "/bin/tests", argv);
|
||||
//create_user_task(NULL, "/bin/jacobi", argv);
|
||||
//create_user_task(NULL, "/bin/jacobi", argv);
|
||||
//create_user_task(NULL, "/bin/server", server_argv);
|
||||
|
|
Loading…
Add table
Reference in a new issue