關於原子操作,還是先看一下opengl程式設計指南中的描述:
關於書中的描述個人的理解是:比如原先的操作是取出記憶體中的數,對數值進行操作,然後寫回記憶體,在這一系列的操作的過程中,乙個的執行緒可能在另乙個執行緒寫回記憶體之前對記憶體進行了讀取,這樣它讀取的數值是不正確的。原子操作把這一系列的操作作為乙個整體,就相當於瞬時完成了一系列的操作,乙個執行緒操作的同時,別的執行緒沒法在乙個整體當中插入進來。但是多個執行緒可能同時讀取,原子操作對這方面就是保證重新序列化並依次執行。
修改**測試一下,先不用原子操作,看一下效果:
#include
"vgl.h"
#include
"vmath.h"
#include
"loadshaders.h"
#include
"vbm.h"
#include
using
namespace std;
gluint vbo;
gluint progcompure;
gluint tex;
gluint atomic_counter_buffer;
void
init()
glunmapbuffer
(gl_shader_storage_buffer)
;// create the atomic counter buffer
glgenbuffers(1
,&atomic_counter_buffer)
;glbindbuffer
(gl_shader_storage_buffer, atomic_counter_buffer)
;glbufferdata
(gl_shader_storage_buffer,
sizeof
(gluint)
,null
, gl_dynamic_copy)
;
shaderinfo csi=
,}; progcompure =
loadshaders
(csi);}
void
display()
cout << endl;
}glunmapbuffer
(gl_shader_storage_buffer);}
void
idle()
else
}int
main
(int argc,
char
*ar**)
init()
;glutidlefunc
(idle)
;glutdisplayfunc
(display)
;glutmainloop()
;return0;
}
#version 430 core
layout
(local_size_x =
4,local_size_y =
4,local_size_z =
4) in;
layout
(binding =
0) buffer outbuf
out;
layout
(binding =
0) buffer countbuf
count;
void
main()
輸出如圖,計算著色器的多個工作組讀的是同乙個值,然後加1:
接著用原子操作看一下效果:
#include
"vgl.h"
#include
"vmath.h"
#include
"loadshaders.h"
#include
"vbm.h"
#include
using
namespace std;
gluint vbo;
gluint progcompure;
gluint tex;
gluint atomic_counter_buffer;
void
init()
glunmapbuffer
(gl_shader_storage_buffer)
;// create the atomic counter buffer
glgenbuffers(1
,&atomic_counter_buffer)
;glbindbuffer
(gl_atomic_counter_buffer, atomic_counter_buffer)
;glbufferdata
(gl_atomic_counter_buffer,
sizeof
(gluint)
,null
, gl_dynamic_copy)
;
shaderinfo csi=
,}; progcompure =
loadshaders
(csi);}
void
display()
cout << endl;
}glunmapbuffer
(gl_shader_storage_buffer);}
void
idle()
else
}int
main
(int argc,
char
*ar**)
init()
;glutidlefunc
(idle)
;glutdisplayfunc
(display)
;glutmainloop()
;return0;
}
#version 430 core
layout
(local_size_x =
4,local_size_y =
4,local_size_z =
4) in;
layout
(binding =
0) buffer outbuf
out;
layout (binding =
1, offset =
0) uniform atomic_uint tesscoord;
void
main()
現在就能保證正確的累加了。
原子性,原子操作
舉個例子 a想要從自己的帳戶中轉1000塊錢到b的帳戶裡。那個從a開始轉帳,到轉帳結束的這乙個過程,稱之為乙個事務。在這個事務裡,要做如下操作 從a的帳戶中減去1000塊錢。如果a的帳戶原來有3000塊錢,現在就變成2000塊錢了。在b的帳戶裡加1000塊錢。如果b的帳戶如果原來有2000塊錢,現在...
原子變數與原子操作
1.原子操作的速度要快於臨界區,event,互斥量,如果多個執行緒同時寫乙個變數時,最方便的就是原子操作。原子操作函式,解決多執行緒安全 2.原子變數也是為了解決執行緒衝突問題,如果兩個執行緒同時訪問同乙個變數,乙個執行緒改變了這個變數,另乙個執行緒就會出現一些bug。3.release和debug...
c 原子操作 賦值 c 原子操作
這個型別可以在兩個狀態間切換 設定set flag true 和清除clear flag false 必須被atomic flag init初始化此時flag為clear狀態,初始化標準為是清除狀態。當你的標誌物件已初始化,那麼你只能做三件事情 銷毀,清除或設定 查詢之前的值 這些事情對應的函式分別...