I have read the description of the AtomicXor function however im not quite sure on the parameters that the function requires? Could someone explain how it works or point me to an example of it in use please? That would be great.
All i am trying to do is Xor two unsigned chars together, however I do understand the the function works only with integers, but this is not a problem for the application in which im using the function.
Well, if you can atomicXor an integer, you can also do a character by using shifts (atomic on 4-byte level is atomic on 1-byte level by definition)
The parameters and usage of the atomic functions is described in the SDK documentation. Basically you pass an address and a value, in that order, that’s all :)
Yep, you can use all regular operations on integers just declared as “int i” etc… These operations are then performed in each thread individually. For that matter, you can do practically anything C syntax allows to any variable declared like that: CUDA is a full fledged compiler. On the device you are really only limited by resources, and you of course can’t make calls to the standard library (or others). Math library functions are limited to those listed in the CUDA programming manual (which includes most everything you can think of: sin/cos/exp, etc…).
Atomic operations are for when you have multiple threads trying to modify the same integer and you need to read, modify, then write all in one atomic (unbreakable) operation. It’s usually best to avoid such situations at all possible, since they incur a large performance penalty.
Ahhh, ok thanks very much Mister! That makes sense External Media
but im trying to Xor elements in two different arrays in a device function. If i do this int the global kernel function this seems to work fine. However if i call a subsequent device function and perform the same Xor, it appears to have no effect? whys that?
eg working:
device int array1[16];
device int array2[16];
global void functionA(){
for (int i =0; i<=15; i++){
array1[i] = array1[i]^array2[i];
}
}
eg not working:
device int array1[16];
device int array2[16];
device void functionB(int array1, int array2){
int temp [16];
for (int l = 0; l<= 15; l++){
temp[l] = array1[l];
}
for (int k = 0; k<=15; k++){
array1[k] = temp[k]^array2[k];
}