コード例 #1
0
        private void SetCudaDataForFormat()
        {
            evalThreads = threadsPerRow * sliceSize;
            int N = sizeSV;

            evalBlocks = (int)Math.Ceiling(1.0 * N * threadsPerRow / evalThreads);

            align = (int)Math.Ceiling(1.0 * sliceSize * threadsPerRow / 64) * 64;


            float[] vecVals;
            int[]   vecColIdx;
            int[]   vecLenght;
            int[]   sliceStart;

            CudaHelpers.TransformToSlicedEllpack(out vecVals, out vecColIdx, out sliceStart, out vecLenght, TrainedModel.SupportElements, threadsPerRow, sliceSize);

            float[] selfSum = TrainedModel.SupportElements.AsParallel().Select(c => c.Values.Sum()).ToArray();


            //copy data to device, set cuda function parameters
            //copy data to device, set cuda function parameters
            valsPtr       = cuda.CopyHostToDevice(vecVals);
            idxPtr        = cuda.CopyHostToDevice(vecColIdx);
            vecLengthPtr  = cuda.CopyHostToDevice(vecLenght);
            sliceStartPtr = cuda.CopyHostToDevice(sliceStart);

            selfSumPtr = cuda.CopyHostToDevice(selfSum);
        }
コード例 #2
0
        public void TransformToSliceEllpackTest_2threads_2slice_5vectors()
        {
            float[] vecVals    = null; // TODO: Initialize to an appropriate value
            int[]   vecIdx     = null; // TODO: Initialize to an appropriate value
            int[]   vecLenght  = null; // TODO: Initialize to an appropriate value
            int[]   sliceStart = null;

            int[]   vecIdxExpected    = new int[] { 0, 2, 4, 1, 3, 0, 2, 4, 1, 3, 0, 2, 4, 1, 3, 0, 2, 4, 1, 3, 0, 2, 4, 1, 3 };
            float[] vecValsExpected   = new float[] { 0, 2, 4, 1, 3, 0, 2, 4, 1, 3, 0, 2, 4, 1, 3, 0, 2, 4, 1, 3, 0, 2, 4, 1, 3 };
            int[]   vecLenghtExpected = new int[] { 0, 3, 5, 8, 10, 13, 15, 18, 20, 23, 25 };
            int[]   vecsliceExpected  = new int[] { 0, 12, 24, 36 };

            CudaHelpers.TransformToSlicedEllpack(out vecVals, out vecIdx, out sliceStart, out vecLenght, problemElements, 2, 2);

            for (int i = 0; i < vecIdxExpected.Length; i++)
            {
                Assert.AreEqual(vecIdxExpected[i], vecIdx[i], "vec idx different at position" + i);
            }

            for (int i = 0; i < vecValsExpected.Length; i++)
            {
                Assert.AreEqual(vecValsExpected[i], vecVals[i], "vec val different at position" + i);
            }

            for (int i = 0; i < vecLenghtExpected.Length; i++)
            {
                Assert.AreEqual(vecLenghtExpected[i], vecLenght[i], "vec lenght different at position" + i);
            }

            for (int i = 0; i < vecsliceExpected.Length; i++)
            {
                Assert.AreEqual(vecsliceExpected[i], sliceStart[i], "vec slice different at position" + i);
            }
        }
コード例 #3
0
        public void TransformToSliceEllpackTest_different_slice_sizes()
        {
            int sliceSize = 4;
            int threads   = 2;
            var problem   = GenerateTestProblemForSliceEllpack(13, sliceSize, 15, new int[] { 3, 6, 5, 4 });

            float[] vecVals    = null; // TODO: Initialize to an appropriate value
            int[]   vecIdx     = null; // TODO: Initialize to an appropriate value
            int[]   vecLenght  = null; // TODO: Initialize to an appropriate value
            int[]   sliceStart = null;

            int[]   vecIdxExpected    = new int[] { 3, 5, 4, 6, 5, 7, 6, 8, 7, 0, 8, 0, 9, 0, 10, 0 };
            float[] vecValsExpected   = new float[] { 1, 1, 2, 2, 3, 3, 4, 4, 1, 0, 2, 0, 3, 0, 4, 0, 5, 5, 6, 6, 7, 7, 8, 8, 5, 5, 6, 6, 7, 7, 8, 8, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 9, 9, 10, 10, 11, 11, 12, 12, 9, 0, 10, 0, 11, 0, 12, 0, 13, 13, 0, 0, 0, 0, 0, 0, 13, 13, 0, 0, 0, 0, 0, 0 };
            int[]   vecLenghtExpected = new int[] { 3, 3, 3, 3, 6, 6, 6, 6, 5, 5, 5, 5, 4 };
            int[]   sliceStarExpected = new int[] { 0, 16, 40, 64, 80 };

            CudaHelpers.TransformToSlicedEllpack(out vecVals, out vecIdx, out sliceStart, out vecLenght, problem, threads, sliceSize);

            for (int i = 0; i < sliceStarExpected.Length; i++)
            {
                Assert.AreEqual(sliceStarExpected[i], sliceStart[i], "vec slice different at position" + i);
            }

            for (int i = 0; i < vecLenghtExpected.Length; i++)
            {
                Assert.AreEqual(vecLenghtExpected[i], vecLenght[i], "vec length different at position" + i);
            }


            for (int i = 0; i < vecValsExpected.Length; i++)
            {
                Assert.AreEqual(vecValsExpected[i], vecVals[i], "vec val different at position" + i);
            }

            for (int i = 0; i < vecIdxExpected.Length; i++)
            {
                Assert.AreEqual(vecIdxExpected[i], vecIdx[i], "vec idx different at position" + i);
            }
        }