Как подсказывает руководство по программированию cuda, я хочу вызвать функцию AtomicAdd:
unsigned long long int atomicAdd(unsigned long long int* address,
unsigned long long int val);
Но при вызове это с двумя переменными:
unsigned long long int *c
и unsigned long long int sum
Я получил эту ошибку:
dotproduct_kernel.cu(23): error: no instance of overloaded function "atomicAdd" matches the argument list
argument types are: (unsigned long long *, unsigned long long)
Я не знал, что long long int
действительно существует, поэтому я попытался long int
long
, но все терпит неудачу.
Мне нужен большой тип данных, потому что мой результат будет около 10 ^ 14.
Вся информация о моем устройстве. Я предполагаю, что вычислительная способность равна 1,2 , верно?
Major revision number: 1
Minor revision number: 2
Name: GeForce GT 240
Total global memory: 1073020928
Total shared memory per block: 16384
Total registers per block: 16384
Warp size: 32
Maximum memory pitch: 2147483647
Maximum threads per block: 512
Maximum dimension 0 of block: 512
Maximum dimension 1 of block: 512
Maximum dimension 2 of block: 64
Maximum dimension 0 of grid: 65535
Maximum dimension 1 of grid: 65535
Maximum dimension 2 of grid: 1
Clock rate: 1340000
Total constant memory: 65536
Texture alignment: 256
Concurrent copy and execution: Yes
Number of multiprocessors: 12
Kernel execution timeout: Yes
Это полный код:
__global__ void dot (long int *a, long int *b, long int *c){
__shared__ long int temp[THREADS_PER_BLOCK];
c[0] = 0;
long index = (blockIdx.x * blockDim.x) + threadIdx.x;
temp[threadIdx.x] = a[index] * b[index];
__syncthreads();
if( 0 == threadIdx.x ){
long int sum = 0;
int i;
for( i = 0; i<THREADS_PER_BLOCK; i++) {
sum += temp[i];
}
atomicAdd(c, sum); //remember of -arch=sm_11
}
}