AVX-512CD(冲突检测)与原子变量访问有何不同?
How AVX-512CD (conflict detection) differs from atomic variables access?
所以我在看 this ANL Training video 他们展示了如何
void Histogram ( const float* age, int* const hist, const int n, const float group_width, const int m) {
const float oogw = 1.0f / group_width;
// Populating the histogram.
for( int i = 0; i < n; i++) {
// Calculating the index of the bin age[i] goes to.
const int j = (int) ( age[i] * oogwflh );
// Incrementing the appropriate bin in the histogram.
hist[j]++;
}
}
并且循环被向量化。用 this 指令。
它与原子有何不同?期望编译器将来在指令级别(针对不同的实体,例如 POD 结构)提供冲突检测支持是否合理?
AVX512 冲突检测指令检测单个分散指令多次写入同一存储位置时可能发生的冲突。这是同一指令中不同向量通道之间的冲突。
原子操作防止当多个逻辑 CPU 对同一地址 "at the same time" 执行 load/store 时发生的竞争条件。
因此,如果您的代码是矢量化的,即使它运行单线程,您也需要冲突检测指令,而在您的代码被并行化并与多个线程一起执行之前,不需要原子操作。
所以我在看 this ANL Training video 他们展示了如何
void Histogram ( const float* age, int* const hist, const int n, const float group_width, const int m) {
const float oogw = 1.0f / group_width;
// Populating the histogram.
for( int i = 0; i < n; i++) {
// Calculating the index of the bin age[i] goes to.
const int j = (int) ( age[i] * oogwflh );
// Incrementing the appropriate bin in the histogram.
hist[j]++;
}
}
并且循环被向量化。用 this 指令。
它与原子有何不同?期望编译器将来在指令级别(针对不同的实体,例如 POD 结构)提供冲突检测支持是否合理?
AVX512 冲突检测指令检测单个分散指令多次写入同一存储位置时可能发生的冲突。这是同一指令中不同向量通道之间的冲突。
原子操作防止当多个逻辑 CPU 对同一地址 "at the same time" 执行 load/store 时发生的竞争条件。
因此,如果您的代码是矢量化的,即使它运行单线程,您也需要冲突检测指令,而在您的代码被并行化并与多个线程一起执行之前,不需要原子操作。