我对C++ 11的一些事情感到困惑std::future.我想动态平衡工作负载,所以如果有一些处理器空闲,我创建一个std::futurewith std::async来划分剩余的数据.它工作正常.
std::future<int> f[MAX_CHILD];
for ( each data item ){
if ( found_idle_processor )
f[i] = std::async( ... );
process();
}
// At last, query the result of f.
for ( each future )
hold = f[i].get();
Run Code Online (Sandbox Code Playgroud)
但有时,一旦找到一些特殊数据项,所有其他数据将被丢弃,程序应立即给出最终结果,然后将启动另一个任务.
std::future<int> f[MAX_CHILD];
for ( each data item ){
if ( found_idle_processor )
f[i] = std::async( ... );
process();
if ( found_special_item )
return final_result;
}
// At last, query the result of each f.
for ( …Run Code Online (Sandbox Code Playgroud) 今天我和我的教授在并行编程课上有了不同的理解,关于什么是"虚假共享".我的教授所说的没什么意义,所以我立即指出了.她认为"虚假分享"会导致程序结果出错.
我说,"错误共享"发生在将不同的内存地址分配给同一个缓存行时,将数据写入其中一个会导致另一个被踢出缓存.如果处理器在两个错误共享地址之间写入转向和转向,则它们都不能停留在高速缓存上,因此所有操作都将导致DRAM的访问.
到目前为止,这是我的意见.事实上,我不确定我说的是什么......如果我有误解,请指出.
所以有一些问题.假设缓存为64字节对齐,4路组关联.
parallel-processing optimization caching computer-architecture false-sharing
我是OpenCL的新手,并且对此限制感到困惑.例如,如果我想写一个LCG,我必须使状态字可以修改为rand()和srand().在ANSI C中,我将使用以下内容执行此操作:
/* ANSI C */
static unsigned long _holdrand = 1; /* Global! */
unsigned long rand(){
_holdrand = _holdrand * 214013L + 2531011L;
return (_holdrand >> 16) & 0x7FFF;
}
void srand( unsigned long seed ){
_holdrand = seed;
}
Run Code Online (Sandbox Code Playgroud)
但OpenCL限制所有全局范围变量__constant.我可以_holdrand进入函数范围,并将其指针退出该函数.
/* OpenCL C */
uint* holdrand(){
__private static uint _holdrand = 1;
return &_holdrand;
}
uint rand(){
*holdrand() = *holdrand() * 214013L + 2531011L;
return (*holdrand() >> 16) & …Run Code Online (Sandbox Code Playgroud)